我有一个dask.array
跨越多个hdf5文件。基本上,我想做的是切片数据集并将生成的切片存储到hdf5。我到目前为止所尝试的基本上是这样的:
In [1]: import dask.array as da
In [3]: import numpy as np
In [5]: xs = da.from_array(np.linspace(0, 10), chunks=10) # could be from hdf5 files
In [7]: import h5py
In [8]: h5f = h5py.File('/tmp/paul/foo.h5')
In [9]: h5f.create_dataset(name='ham', data=xs)
Out[9]: <HDF5 dataset "ham": shape (50,), type "<f8">
这很有效。但是,当我da.concatenate
多个h5py
数据集时,create_dataset
函数似乎冻结(线程死锁?)。请注意,xs
可以是(ballpark)10 GB的数据集,跨越10个文件,每个1 GB。
在不诉诸xs
并冒h5py
的情况下,将da.compute
写入MemoryError
数据集的合理方法是什么?
答案 0 :(得分:1)
我怀疑h5py库正在将你的dask数组转换为内存中的numpy数组,这可能不是你想要的。
相反,您可能需要商店功能(请参阅this section in the documentation)
da.to_hdf5('myfile.hdf5', '/x', x)
您可能还需要to_hdf5方法(请参阅this section in the documentation)
to_hdf5
您应该注意适当地将HDF5数据集分块,以使其与您的dask.array分块对齐。如果您不想自己考虑,Variable.get('xxxx_apiKey')
方法将为您处理此问题。