使用 dask 将大于内存的 csv 文件存储到 hdf5 文件
use dask to store larger then memory csv file(s) to hdf5 file
任务:读取大于内存的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')
我该怎么做?
实际上,我有一组代表 3D 数组的 2D 切片的 csv 文件
我想 assemble 并存储。关于如何做后者的建议
也将受到欢迎。
鉴于下面的评论,这是我尝试过的众多变体之一:
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)
导致错误:
键错误: ('arr12345', 77, 0)
您应该在 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 数组,那么你需要弄清楚每个数据块有多少行并将其分配给块属性。参见 http://docs.dask.org/en/latest/array-chunks.html#unknown-chunks。不过我不推荐这种方法,它太复杂了。
您可能想要执行以下操作。问题的真正症结在于,在 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" 表示 "find the lengths",或者您可以提供自己的一组值。
任务:读取大于内存的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')
我该怎么做?
实际上,我有一组代表 3D 数组的 2D 切片的 csv 文件 我想 assemble 并存储。关于如何做后者的建议 也将受到欢迎。
鉴于下面的评论,这是我尝试过的众多变体之一:
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)
导致错误: 键错误: ('arr12345', 77, 0)
您应该在 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 数组,那么你需要弄清楚每个数据块有多少行并将其分配给块属性。参见 http://docs.dask.org/en/latest/array-chunks.html#unknown-chunks。不过我不推荐这种方法,它太复杂了。
您可能想要执行以下操作。问题的真正症结在于,在 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" 表示 "find the lengths",或者您可以提供自己的一组值。