dask 和并行 hdf5 写作

dask and parallel hdf5 writing

在我的代码中,我使用 mpi (mpi4py/h5py) 在一个 hdf5 文件中并行保存多个处理过的图像(numpy 数组)。为此,需要使用 driver=mpio 选项打开文件。

import h5py
from mpi4py import MPI
file_hdl=h5py.File(file_lath,'r+',driver='mpio', comm=MPI.COMM_WORLD)

我想离开 mpi 并使用 dask 进行并行化。是否可以在 dask 中使用并行 hdf5?我还需要依赖mpi吗?如果是这样,是否有更好的方法来存储数据? 谢谢

这是一个困难而复杂的问题。

一般来说,HDF5 针对并行 MPI 读写进行了高度优化。在 MPI 之外很难获得相同级别的支持。

此外,这个问题很难,因为人们使用 Dask 和 HDF5 的方式不同,有些人在同一个进程中使用多个线程(h5py 不是线程安全的),而其他人则在同一硬盘驱动器上或网络上的多台计算机上使用多个进程文件系统。此外,用户经常使用多个 HDF5 文件,例如每天一个文件的数据。

Dask 通常使用锁来处理对 HDF5 的并行读取和写入。如果您在单个进程中,那么这是一个普通的 threading.Lock 对象。通常这不会对性能产生太大影响,因为从 HDF5 文件读取通常是 I/O 而不是 CPU 绑定。有一点争论,但没什么好担心的。

在分布式设置中,我们使用可序列化锁,它可以防止任何特定进程中的多线程并发访问,但不会阻止两个进程相互冲突。通常这不是问题,因为只要您不在同一个进程中,读取冲突就很好,而且人们通常编写与 HDF5 块对齐的内聚块。

人们每天愉快地与 Dask.array 并行使用 HDF5。但是,我不相信一切都是万无一失的。我怀疑设计破案是可能的。

(此外,这个特定方面正在迅速发展。这个答案可能很快就会过时)

https://github.com/pydata/xarray/issues/798