【问题标题】:Multiprocessing: writing into a hdf5 file多处理:写入 hdf5 文件
【发布时间】:2022-07-06 23:11:20
【问题描述】:

我正在 Python 中运行并行化代码,并且尝试在每次迭代中保存一些值。我的代码可以简化/总结如下:

# Import necessary libraries

def func(a,b):
    # Generate some data and save it into "vector".
    
    # Create a Hdf5 file and save data in vector.
    with h5py.File('/some_file.hdf5', 'w') as f:

        f.create_dataset('data_set', data=vector)

# Some code

# Parallelize func
if __name__ == '__main__':
    with mp.Pool(2) as p:
        [p.apply_async(func, args=(elem, b)) for elem in big_array]

我在并行化的同时保存文件以节省内存,因为我将处理大量数据。

但是,我每次运行脚本时,都没有生成hdf5文件,也没有保存数据。

我对使用 Python 进行并行化还很陌生,但我不明白问题出在哪里。

【问题讨论】:

  • 要与 h5py 并行编写 HDF5 文件,HDF5 和 h5py 都必须在启用并行 HDF5 的情况下编译(启用 MPI 支持)。这是通过 mpi4py Python 包完成的。完整的详细信息在the h5py docs
  • 感谢 kcw78!我快速浏览了mpi5py,它似乎不太容易实现。你能给我一个例子来说明如何做到这一点吗?我目前正在使用multiprocessing,是否可以使用它,这样我就不必在我的代码中修改并行化的核心?
  • 对不起,我只阅读了文档,并没有使用mpi4pyThe HDF Group Forum 上有一个 h5py 特定论坛。这可能是您实施细节的最佳来源。

标签: python parallel-processing python-multiprocessing hdf5 h5py


【解决方案1】:

最后,我将with 命令(最后两行)更改为:

p = mp.Pool(2)
result = [p.apply_async(func, args=(elem, b)) for elem in big_array]
p.close()
p.join()

它成功了!

似乎前面的代码,使用with 命令,基本上在任务分配给每个处理器时离开for 循环,并在所有计算完成之前离开循环。

【讨论】: