Я добавляю это как ответ, чтобы получить больше места, чем в комментариях.
Быстрая работа с «большими данными»
200 ГБ текстовых файлов - это достаточно большие данные, которые потребует значительных усилий для ускорения обработки или значительного времени ожидания. Нет простого пути назад;)
- вам нужно получить данные в память, чтобы начать любую работу
- это быстрее всего читать ваши файлы один за другим (НЕ параллельно) при чтении с одного жесткого диска
- измерьте, сколько времени потребуется для загрузки данных без разбора
- ваше время загрузки для нескольких похожих файлов будет кратно времени одного файла, вы здесь не может быть никаких улучшений c
- , чтобы улучшить время загрузки, которое вы можете сжимать входными файлами - это окупается, только если вы будете использовать один и тот же источник данных несколько раз (после сжатия меньше байты должны пересекать жесткий диск -> граница памяти, что медленно)
- при выборе способа сжатия данных вы стремитесь к тому, чтобы нагрузка (сжатая) + время распаковки была меньше, чем нагрузка (распакованная)
- вам необходимо проанализировать необработанные данные
- измерить, сколько времени потребуется для анализа данных
- , если вы не можете разделить анализ, измерьте, сколько т То есть, для загрузки и анализа данных требуется, чтобы время анализа было разницей с ранее измеренным временем загрузки
- Разбор может быть распараллелен, но это имеет смысл, только если это существенная часть времени загрузки
- вам нужно сделать свое дело
- обычно это можно сделать параллельно
- вам нужно сохранить результаты
- если результаты не настолько велики, как входные данные, вам все равно
- если они огромны, вам нужно снова сериализовать свой IO, то есть сохранять его один за другим, а не параллельно
- снова помогает сжатие, если вы выбираете алгоритм и настройки, где время сжатия + время записи меньше, чем время записи несжатых данных
Для получения необработанного время загрузки, bash
ваш друг. Используя pipe viewer
или встроенный time
, вы можете легко проверить время, необходимое для чтения файла, выполнив
pv mydata.txt > /dev/null
# alternatively
time cat mydata.txt > /dev/null
Помните, что ваш дисковый кэш сработает, когда вы будете неоднократно измерять один файл.
Что касается сжатия, если вы застряли с R, gzip
является единственным разумным вариантом. Если вы сделаете некоторую предварительную обработку в bash
, то lz4
- инструмент выбора, потому что он действительно быстр при приличном сжатии. ios.
gzip -3 mydata.txt
pv mydata.txt.gz | zcat > /dev/null
Здесь мы подходим к предварительная обработка. Стоит использовать UNIX инструменты, которые, как правило, очень быстро обрабатывают данные перед загрузкой в R. Вы можете фильтровать столбцы с cut
, фильтровать строки с mawk
(что часто намного быстрее, чем gawk
).