Подтвердить что ты не робот

Самый эффективный способ экспорта больших (3.9 миллионных) данных. Кадры в текстовый файл?

У меня довольно большой фрейм данных в R, который я хотел бы экспортировать в SPSS. Этот файл вызвал у меня частые головные боли, которые пытались импортировать его в R в первую очередь, однако я успешно использовал read.fwf() с помощью опций comment.char="%" (символ, не отображающийся в файле) и fill= TRUE (это был файл ASCII с фиксированной шириной с несколькими строками, в которых отсутствуют все переменные, вызывая сообщения об ошибках).

В любом случае, мой кадр данных в настоящее время состоит из 3,9 млн наблюдений и 48 переменных (всех символов). Я могу записать его в файл довольно быстро, разделив его на 4 x 1 миллионные наборы с df2 <- df[1:1000000,], за которыми следуют write.table(df2) и т.д., Но не может записать весь файл за один проход без блокировки компьютера и необходимости жесткого reset, чтобы вернуться.

После прослушивания анекдотических историй о том, как R не подходит для больших наборов данных в течение многих лет, я впервые столкнулся с проблемой такого рода. Интересно, существуют ли другие подходы (низкоуровневый "сброс" файла непосредственно на диск?) Или есть ли какой-то неизвестный мне пакет, который может эффективно обрабатывать большие файлы этого типа?

4b9b3361

Ответ 1

Предполагая, что ваша операционная система недостаточно оперативна, и поэтому R должен использовать файл подкачки, что замедляет работу. Если вам платят за код, то покупка большего объема оперативной памяти, вероятно, будет дешевле, чем вы пишете новый код.

Тем не менее, есть некоторые возможности. Вы можете экспортировать файл в базу данных, а затем использовать этот объект базы данных для записи в текстовый файл. JD Длинный ответ на этот вопрос рассказывает вам, как читать файлы таким образом; это не должно быть слишком сложным, чтобы обратить вспять процесс. В качестве альтернативы для написания таких файлов можно использовать пакеты bigmemory и ff (как упоминалось Дэви).

Ответ 2

1) Если ваш файл является все символьной строкой, он экономится с помощью write.table() намного быстрее, если вы сначала измените его на matrix.

2) также записывайте его в кусках, скажем 1000000 строк, но всегда в один и тот же файл и используя аргумент append = TRUE.

Ответ 3

Update

После обширной работы Matt Dowle, распараллеливающейся и добавляющей другие улучшения эффективности, fread теперь достигает 15 раз быстрее, чем write.csv. Подробнее см. Связанный ответ.


Теперь data.table имеет функцию fwrite, предоставленную Отто Сейскари, которая, как представляется, примерно в два раза быстрее, чем write.csv в целом. См. здесь для некоторых тестов.

library(data.table) 
fwrite(DF, "output.csv")

Обратите внимание, что имена строк исключены, поскольку тип data.table не использует их.

Ответ 4

Хотя я использую его только для чтения очень больших файлов (10+ Gb), я считаю, что пакет ff имеет функции для записи чрезвычайно больших dfs.

Ответ 5

Ну, так как ответ с действительно большими файлами и R часто является, лучше всего разгрузить эту работу в базу данных. SPSS имеет ODBC-соединение, а RODBC - интерфейс от R до SQL.

Замечу, что в процессе проверки моей информации я был зачерпнут.