Объединить файлы csv с помощью dask

Я новичок в питоне. Я использую dask для чтения 5 больших (> 1 ГБ) файлов csv и слияния (как SQL) их в фрейм данных dask. Теперь я пытаюсь записать объединенный результат в один CSV. Я использовал compute () в кадре данных dask для сбора данных в один df, а затем вызвал to_csv. Однако compute () медленно читает данные по всем разделам. Я попытался вызвать to_csv непосредственно в dask df, и он создал несколько файлов .part (я не пытался объединить эти файлы .part в csv). Есть ли альтернатива для получения dask df в одном csv или любом параметре для compute () для сбора данных. Я использую 6 ГБ оперативной памяти с жестким диском и процессором i5.

Спасибо


person SRB    schedule 23.03.2017    source источник
comment
Я предполагаю, что вызов compute () не медленный, потому что чтение данных занимает много времени, а потому, что их слияние может потребовать перемешивания. Планировщик по умолчанию может не подходить для этого. Вы пробовали другие планировщики?   -  person Someone    schedule 23.03.2017
comment
Я не исследовал другие планировщики. Сейчас попробую. Большое спасибо   -  person SRB    schedule 23.03.2017


Ответы (2)


Dask.dataframe не будет записывать ни в один файл CSV. Как вы упомянули, он будет записывать в несколько файлов CSV, по одному файлу на раздел. Ваше решение вызова .compute().to_csv(...) будет работать, но вызов .compute() преобразует полный кадр данных dask.data в кадр данных Pandas, который может заполнить память.

Один из вариантов - просто избегать Pandas и Dask вместе и просто читать байты из нескольких файлов и выгружать их в другой файл.

with open(out_filename, 'w') as outfile:
    for in_filename in filenames:
        with open(in_filename, 'r') as infile:
            # if your csv files have headers then you might want to burn a line here with `next(infile)
            for line in infile:
                outfile.write(line + '\n')

Если вам не нужно ничего делать, кроме слияния ваших CSV-файлов в более крупный, я бы просто сделал это и вообще не трогал pandas / dask. Они попытаются прочитать данные CSV в данные в памяти, что займет некоторое время и вам не понадобится. Если, с другой стороны, вам нужно выполнить некоторую обработку с помощью pandas / dask, я бы использовал dask.dataframe для чтения и обработки данных, записи во многие файлы csv, а затем использовал описанный выше трюк для их последующего слияния.

Вы также можете рассмотреть возможность записи в хранилище данных, отличное от CSV. Такие форматы, как HDF5 и Parquet, могут быть намного быстрее. http://dask.pydata.org/en/latest/dataframe-create.html

person MRocklin    schedule 23.03.2017
comment
Я объединил файлы, используя внутреннее соединение для определенного значения столбца, используя dask. Я попытаюсь прочитать несколько файлов .part, как вы упомянули во фрагменте кода выше, вместо прямого использования compute (). Также я изучу другие форматы. Большое спасибо - person SRB; 23.03.2017
comment
Вероятно, вы можете ускорить это, используя 3 потока, каждый из которых работает с отдельным файлом с общей очередью для обработки данных. - person denfromufa; 20.09.2018

Начиная с Dask 2.4.0 теперь вы можете указать single_file=True при вызове to_csv. Пример: dask_df.to_csv('path/to/csv.csv', single_file=True)

Как сказал @mrocklin, я рекомендую использовать другие форматы файлов.

person vtnate    schedule 01.11.2019