任务:读取大于内存的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)
答案 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。我不建议这种方法,因为它不必要地复杂。