Dask / hdf5:按组阅读?

时间:2016-10-12 19:47:55

标签: python hdf5 h5py dask

我必须读入并在大型数据帧/ numpy数组的许多块上独立操作。但是,这些块以特定的,非均匀的方式选择,并自然地分成hdf5文件中的组。每个组都足够小以适应内存(尽管即使没有限制,我认为标准的分块程序应该足够了。)

具体而言,而不是

 f = h5py.File('myfile.hdf5')
 x = da.from_array(f['/data'], chunks=(1000, 1000))

我想要更接近(伪代码)的东西:

 f = h5py.File('myfile.hdf5')
 x = da.from_array(f, chunks=(f['/data1'], f['/data2'], ...,))

http://dask.pydata.org/en/latest/delayed-collections.html我相信暗示这是可能的,但我仍在阅读并理解dask / hdf5。

我以前的实现使用了许多CSV文件,并根据需要使用自己的多处理逻辑读取它们。我想用hdf5将所有这些功能合并到dask中。

hdf5 group / read的分块是否可行,我的思路还行吗?

1 个答案:

答案 0 :(得分:1)

我会从许多组中读取许多dask.arrays作为单块dask.arrays,然后连接或堆叠这些组。

阅读许多dask.arrays

f = h5py.File(...)
dsets = [f[dset] for dset in datasets]
arrays = [da.from_array(dset, chunks=dset.shape) for dset in dsets]

或者,使用锁来防御HDF5

HDF5不是线程安全的,所以我们使用一个锁来防止并行读取。在阅读不同的小组时,我实际上没有检查过是否有必要。

from threading import Lock
lock = Lock()

arrays = [da.from_array(dset, chunks=dset.shape, lock=lock) 
           for dset in dsets]

将阵列堆叠或连接在一起

array = da.concatenate(arrays, axis=0)

请参阅http://dask.pydata.org/en/latest/array-stack.html

或使用dask.delayed

您也可以按照建议使用dask.delayed来读取单块dask.arrays的第一步