任务:读取大于内存的csv文件,转换为数组并存储在hdf5中。 一种简单的方法是使用 pandas 分块读取文件 但我想使用 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)
这会导致错误: key 错误:('arr12345', 77, 0)
最佳答案
您可能想要执行如下操作。问题的真正关键在于,在 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”表示“求长度”,或者您可以提供自己的一组值。
关于csv - 使用 dask 将大于内存的 csv 文件存储到 hdf5 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52599618/