【问题标题】:Dask/hdf5: Read by group?Dask/hdf5:按组阅读?
【发布时间】:2017-02-21 18:10:48
【问题描述】:

我必须读取并独立操作大型数据帧/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 组/读取进行分块并且我的思路可以吗?

【问题讨论】:

    标签: python hdf5 h5py dask


    【解决方案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 的第一步

    【讨论】:

    • chunks=dset.shape 是我在概念上所缺少的。
    • 后续:我认为 f[dset] 是懒惰的?这种规模是否自然应该每个组都需要自己分块?
    • 是的,f[dset] 是懒惰的。是的,这可以自然地扩展到每个组的分块。
    • 最后一个问题:数据集是否并行读取,而不仅仅是操作?我问是因为我不确定将每个 dset 绑定到同一个描述符是否会导致问题。
    • 如果您想保护您的 HDF5 文件,您可以为da.from_array 提供锁定。 from threading import Lock; lock = Lock(); arrays = [da.from_array(..., lock=lock) for ...]
    猜你喜欢
    • 1970-01-01
    • 2022-07-07
    • 2021-04-30
    • 2017-05-13
    • 2020-09-17
    • 2020-04-14
    • 1970-01-01
    • 2019-01-16
    • 1970-01-01
    相关资源
    最近更新 更多