python - 达斯克/HDF5 : Read by group?

标签 python hdf5 h5py dask

我必须读入并独立操作大型数据帧/numpy 数组的许多 block 。然而,这些 block 是以特定的、非统一的方式选择的,并且在 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 读取为单 block 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做阅读单 block dask.arrays 的第一步

关于python - 达斯克/HDF5 : Read by group?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40007106/

相关文章:

python - 使用 python 和 h5py 更新 hdf5 中的键值

Python 2.7 : Appending Data to Table in Pandas

python - Pandas - 检索 HDF5 列和内存使用情况

python - 如何提供错误检查以确保用户输入仅允许字母并在键入数字时提供循环错误消息?

python - 如何在 Pygame 中的两个随机生成的点之间每 20 个像素绘制一个圆圈?

python - 使用 pandas 将 ndarray 值转换为整个数据帧的数值

python - 通过 Python 连接到托管在远程服务器上的 MySQL 数据库,但无法直接访问

python - 使用 Pandas 在 HDF 中存储包含字符串的数据帧时的神秘之处

python - 如何从文件中提取非常大的 HDF5 数据集并写入另一个文件?

python : Dot product of dask array