使用dask将更大的内存csv文件存储到hdf5文件

时间:2018-10-01 22:15:59

标签: csv hdf5 dask

任务:读取大于内存的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文件,它们代表3D数组的2D切片 我想组装和存放。关于后者的建议 也将受到欢迎。

鉴于以下评论,这是我尝试过的众多变体之一:

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 :(得分:2)

您可能想要执行以下操作。问题的真正症结在于,在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')

其中“ True”表示“查找长度”,或者您可以提供自己的一组值。

答案 1 :(得分:1)

您应该在dask数据帧而不是dask数组上使用to_hdf方法

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。我不建议这种方法,因为它不必要地复杂。