Загрузка большого архива данных с использованием dask - PullRequest
1 голос
/ 25 февраля 2020

Я пытаюсь загрузить большой сжатый набор данных в python со следующей структурой:

  • year.zip
    • year
      • month
        • много файлов .csv

До сих пор я использовал библиотеку ZipFile для перебора каждого из CSV-файлы и загрузите их, используя pandas.

zf = ZipFile(year.zip)

for file in zf.namelist:
    try:
        pd.read_csv(zf.open(file))

Требуется много времени, и я смотрю на оптимизацию кода. Один из вариантов, с которыми я столкнулся, - использовать библиотеку dask Тем не менее, я не могу понять, как лучше всего реализовать его, чтобы получить доступ хотя бы к целому месяцу файлов CSV за одну команду. Какие-либо предложения? Также открыт для других подходов оптимизации

1 Ответ

0 голосов
/ 25 февраля 2020

Есть несколько способов сделать это. Наиболее похожим на ваше предложение будет что-то вроде:

zf = ZipFile("year.zip")
files = list(zf.namelist)
parts = [dask.delayed(pandas.read_csv)(f) for f in files)]
df = dd.from_delayed(parts)

Это работает, потому что zip-файл имеет список смещений, так что файлы компонентов могут быть прочитаны независимо; однако производительность может зависеть от того, как был создан архив, и помните: у вас есть только одно устройство хранения, пропускная способность устройства может стать вашим узким местом в любом случае. Используя преимущества fsspec, абстракции файловой системы, используемой dask

df = dd.read_csv('zip://*.csv', storage_options={'fo': 'year.zip'})

(конечно, выберите шаблон glob, соответствующий вашим файлам; вы также можете использовать список файлов здесь , если вы добавите к ним "zip: //")

...