Более быстрый способ чтения одного столбца файла CSV
Я пытаюсь как можно быстрее прочитать один столбец файла CSV
на R
. Я надеюсь сократить стандартные методы с точки зрения времени, затрачиваемого на то, чтобы получить столбец в ОЗУ в 10 раз.
Какова моя мотивация? У меня два файла; один называется Main.csv
, который составляет 300000 строк и 500 столбцов, а один называется Second.csv
, который составляет 300000 строк и 5 столбцов. Если я system.time()
команда read.csv("Second.csv")
, это займет 2,2 секунды. Теперь, если я использую один из двух методов ниже, чтобы прочитать первый столбец Main.csv
(что составляет 20% от размера Second.csv
, так как это 1 столбец вместо 5), это займет более 40 секунд. Это тот же самый промежуток времени, который требуется для чтения всего файла размером 600 мегабайт, явно неприемлемого.
-
Способ 1
colClasses <- rep('NULL',500)
colClasses[1] <- NA
system.time(
read.csv("Main.csv",colClasses=colClasses)
) # 40+ seconds, unacceptable
-
Способ 2
read.table(pipe("cut -f1 Main.csv")) #40+ seconds, unacceptable
Как уменьшить это время? Я надеюсь на решение R
.
Ответы
Ответ 1
Я бы предложил
scan(pipe("cut -f1 -d, Main.csv"))
Это отличается от исходного предложения (read.table(pipe("cut -f1 Main.csv"))
) несколькими способами:
- поскольку файл разделен запятыми и
cut
предполагает разделение табуляции по умолчанию, вам нужно указать d,
, чтобы указать разделение запятой
-
scan()
намного быстрее, чем read.table
для чтения простых/неструктурированных данных.
В соответствии с комментариями OP это занимает около 4, а не 40 + секунд.
Ответ 2
В этом блоке есть сравнение скорости методов чтения больших CSV файлов.
fread является самым быстрым на порядок.
Как уже упоминалось в комментариях выше, вы можете использовать параметр select для выбора столбцов для чтения - так:
fread("main.csv",sep = ",", select = c("f1") )
будет работать