используйте dask для хранения больших, чем память, файлов CSV в файл hdf5 - PullRequest
0 голосов
/ 02 октября 2018

Задача: читать больше, чем память csv-файлов, конвертировать в массивы и сохранять в hdf5.Один простой способ - использовать панды для чтения файлов кусками, но я хотел использовать dask, но пока безуспешно:

Последняя попытка:

fname='test.csv'
dset = dd.read_csv(fname, sep=',', skiprows=0, header=None)
dset.to_records().to_hdf5('/tmp/test.h5', '/x')

Как я мог это сделать?

На самом деле, у меня есть набор CSV-файлов, представляющих 2D-фрагменты 3D-массива, которые я хотел бы собрать и сохранить.Было бы приветствоваться также предложение о том, как сделать последнее.

Учитывая комментарии ниже, вот один из многих вариантов, которые я попробовал:

dset  = dd.read_csv(fname, sep=',', skiprows=0, header=None, dtype='f8')
shape = (num_csv_records(fname), num_csv_cols(fname))
arr   = da.Array( dset.dask, 'arr12345', (500*10, shape[1]), 'f8', shape)
da.to_hdf5('/tmp/test.h5', '/x', arr)

, что приводит к ошибке: KeyError: ('arr12345', 77, 0)

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Возможно, вы захотите сделать что-то вроде следующего.Реальная суть проблемы заключается в том, что в случае read-csv dask не знает количество строк данных до полной загрузки, и поэтому результирующий фрейм данных имеет неизвестную длину (как это обычно бывает).для фреймов данных).С другой стороны, массивы, как правило, должны знать свою полную форму для большинства операций.В вашем случае у вас есть дополнительная информация, поэтому вы можете обойти проблему.

Вот пример.

Данные

0,1,2
2,3,4

Код

dset = dd.read_csv('data', sep=',', skiprows=0, header=None)
arr = dset.astype('float').to_dask_array(True)
arr.to_hdf5('/test.h5', '/x')

Где «Истина» означает «найти длины», или вы можете указать свой собственный набор значений.

0 голосов
/ 05 октября 2018

Вы должны использовать метод to_hdf на dask-массивах данных, а не на dask-массивах

import dask.dataframe as dd
df = dd.read_csv('myfile.csv')
df.to_hdf('myfile.hdf', '/data')

В качестве альтернативы, вы можете рассмотреть возможность использования паркета.Это будет быстрее и проще во многих отношениях

import dask.dataframe as dd
df = dd.read_csv('myfile.csv')
df.to_parquet('myfile.parquet')

Для получения дополнительной информации см. Документацию по созданию и хранению кадров данных dask: http://docs.dask.org/en/latest/dataframe-create.html

Для массивов

Если по какой-то причине вы действительно хотите сначала преобразовать в массив dask, то вам необходимо выяснить, сколько строк имеет каждый блок ваших данных, и назначить его атрибуту chunks.См. http://docs.dask.org/en/latest/array-chunks.html#unknown-chunks.Я не рекомендую такой подход, хотя он слишком сложен.

...