Обработка больших сжатых CSV-файлов с помощью Dask - PullRequest
0 голосов
/ 07 июня 2018

установка состоит в том, что у меня есть восемь больших CSV-файлов (по 32 ГБ каждый), которые сжимаются с Zip-файлами до 8 ГБ каждый.Я не могу работать с несжатыми данными, так как хочу сэкономить дисковое пространство и у меня не осталось 32 * 8 ГБ свободного места.Я не могу загрузить один файл, например, pandas, потому что он не помещается в память.

Я думал, что Dask - разумный выбор для этой задачи, но не стесняйтесь предлагать другой инструмент, если вы считаете, что он соответствует цели.

Можно ли обработать один сжатый файл объемом 8 ГБ с помощью Dask, читая параллельно несколько фрагментов сжатого файла, обрабатывать каждый фрагмент и сохранять результаты на диск?

Первая проблема заключается в том, что Dask не поддерживает .zip. В этом выпуске предлагается использовать dask.delayed, но я также могу изменить формат на .xz или что-то еще.

Во-вторых, и, вероятно, связано с выборомформат сжатия: возможен ли параллельный доступ только к частям сжатого файла.

Или лучше разбить каждый несжатый файл CSV на более мелкие части, которые помещаются в память, а затем обработать повторно сжатые меньшие части с помощьючто-то вроде этого:

import dask.dataframe as dd

df = dd.from_csv('files_*.csv.xz', compression='xz')

На данный момент, я бы предпочел что-то похожее на первое решение, которое кажется более скудным, но я могу быть совершенно ошибочным, так как эта область является новой для меня.

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 07 июня 2018

Самое простое решение , безусловно, заключается в потоковой передаче больших файлов в несколько сжатых файлов каждый (не забудьте завершить каждый файл на новой строке!), А затем загрузите их с помощью Dask, как вы предлагаете.Каждый файл меньшего размера станет одним разделом данных в памяти, поэтому, если файлы достаточно малы, вам не хватит памяти при обработке данных с помощью Dask.

Основная причина здесь заключается в том, чтоСписок форматов bz2, gz или zip не имеет произвольного доступа, единственный способ прочитать данные - с самого начала данных.xz - это единственный формат, который допускает блочное сжатие в файле, поэтому, в принципе, можно было бы загружать блочно, что не совсем то же самое, что и реальный произвольный доступ.Это будет делать то, что вы после.Однако этот шаблон на самом деле очень похож на наличие отдельных файлов, поэтому не стоит дополнительных усилий записывать файлы в режиме блокировки (не по умолчанию) и использовать функции dask.bytes.compression.get_xz_blocks, xz_decompress, которые в настоящее время ни для чего не используются в базе кода.

...