Каков самый быстрый способ и самый быстрый формат для загрузки больших наборов данных в R

У меня большой набор данных (около 13 ГБ без сжатия), и мне нужно загружать его несколько раз. Первая загрузка (и сохранение в другом формате) может быть очень медленной, но каждая последующая загрузка должна быть максимально быстрой. Какой самый быстрый способ и самый быстрый формат для загрузки набора данных?

Подозреваю, что оптимальный выбор - это что-то вроде

 saveRDS(obj, file = 'bigdata.Rda', compress = FALSE)
 obj <- loadRDS('bigdata.Rda)

Но это кажется медленнее, чем использование функции fread в пакете data.table. Этого не должно быть, потому что fread конвертирует файл из CSV (хотя, по общему признанию, он сильно оптимизирован).

Вот некоторые тайминги для набора данных размером ~ 800 МБ:

> system.time(tmp <- fread("data.csv"))
Read 6135344 rows and 22 (of 22) columns from 0.795 GB file in 00:00:43
     user  system elapsed 
     36.94    0.44   42.71 
 saveRDS(tmp, file = 'tmp.Rda'))
> system.time(tmp <- readRDS('tmp.Rda'))
     user  system elapsed 
     69.96    2.02   84.04

Предыдущие вопросы

Этот вопрос связан с текущим состоянием R, но не отражает его, например, ответ предполагает, что чтение из двоичного формата всегда будет быстрее, чем из текстового. Предложение использовать * SQL также бесполезно в моем случае, поскольку требуется весь набор данных, а не только его подмножество.

Также есть связанные вопросы о самом быстром способе однократной загрузки данных (например: 1).


person orizon    schedule 07.08.2015    source источник
comment
Как вы ожидаете, что люди ответят, не предоставив никаких данных? Я действительно не вижу смысла этого вопроса, так как кажется, что вы уже открыли быстрый (-ые) способ (-ы).   -  person Rich Scriven    schedule 08.08.2015
comment
Я один из тех, кто проголосовал против, и я очень близок к тому, чтобы закрыть его как дубликат, так как я действительно изо всех сил пытаюсь понять, какая информация будет исходить из этого вопроса, который не был подробно рассмотрен в другом месте.   -  person joran    schedule 08.08.2015
comment
Хорошо, я нажал на курок. Если вы не согласны, изложите свое мнение в комментариях, и, возможно, я буду отклонен.   -  person joran    schedule 08.08.2015
comment
@joran У меня нет другого ответа, который объясняет, почему fread быстрее loadRDS. Это кажется несовместимым с убеждением, что загрузка двоичных форматов всегда быстрее, чем загрузка текстовых форматов. Будет ли полезно, если я задам только этот вопрос?   -  person orizon    schedule 08.08.2015
comment
@joran В настоящее время у меня нет желания или энтузиазма оспаривать это, но выбор дубликатов кажется плохим. Выбранный повторяющийся вопрос относится только к чтению текстовых данных в табличном формате. [Аналогичный вопрос, который я связал в своем вопросе] (stackoverflow.com/questions/4756989/) гораздо ближе к заданному мною вопросу.   -  person orizon    schedule 08.08.2015
comment
@orizon Я не вижу ни единой причины в вашем вопросе. Если вас интересует, почему один метод быстрее другого, я думаю, что это совершенно другой вопрос. Хотя я не уверен, что это будет хороший вопрос для SO, поскольку полный ответ, вероятно, может быть длинной статьей.   -  person Gregor Thomas    schedule 08.08.2015
comment
@Gregor Вы правы, что это не совсем тот вопрос, который я задавал, но это компромиссный вопрос, который меня интересовал. Я все еще чувствую, что на мой вопрос нет ответа со стороны предполагаемых дубликатов, но на данный момент препятствие для получения ответа on stackoverflow слишком высок, чтобы он мне нравился, и я поищу в другом месте.   -  person orizon    schedule 08.08.2015
comment
Я разместил ссылку в чате R, приглашая людей не соглашаться и отвергать меня, чтобы убедиться, что это привлекло много внимания людей из R.   -  person joran    schedule 08.08.2015


Ответы (1)


Это зависит от того, что вы планируете делать с данными. Если вы хотите, чтобы все данные в памяти для какой-либо операции, я думаю, лучше всего использовать fread или readRDS (размер файла для данных, сохраненных в RDS, намного меньше, если это важно для вас).

Если вы будете выполнять сводные операции с данными, я нашел одноразовое преобразование в базу данных (с использованием sqldf), гораздо лучший вариант, поскольку последующие операции выполняются намного быстрее, выполняя sql-запросы к данным, но это также потому, что я не ОЗУ не хватает для загрузки файлов размером 13 ГБ.

person Rohit Das    schedule 07.08.2015
comment
Одна из причин, по которой размер файла с использованием saveRDS меньше, заключается в том, что используется сжатие, которое снижает производительность; хотя, вероятно, помогает и более эффективное представление факторов и персонажей. - person orizon; 08.08.2015