Dask/hdf5: 分组阅读?
Dask/hdf5: Read by group?
我必须读入并独立操作大型 dataframe/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可行吗?我的思路可以吗?
我会从许多组中读取许多 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
我必须读入并独立操作大型 dataframe/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可行吗?我的思路可以吗?
我会从许多组中读取许多 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