我可以从多个进程/线程写入 HDF5 文件吗?

ben*_*min 5 python parallel-processing hdf5 bigdata netcdf4

hdf5 是否支持从不同线程或不同进程并行写入同一文件?或者,hdf5 是否支持非阻塞写入?

如果是这样,那么 NetCDF4 和 python 绑定是否也支持它?

我正在编写一个应用程序,我希望不同的 CPU 内核同时计算用于非常大输出阵列的非重叠图块的输出。(稍后我想从它读取部分作为单个数组,不需要我自己的驱动程序来管理索引许多单独的文件,理想情况下不需要在磁盘上重新排列它的额外 IO 任务。)

ben*_*min 4

这并不简单,但有各种潜在的解决方法。

普通的HDF5库显然甚至不支持多线程并发读取不同文件。因此,NetCDF4 以及两者的 python 绑定将不支持并行写入。

如果输出文件是预初始化的并且禁用了分块和压缩,以避免有块索引,那么(原则上)通过单独的进程对同一文件进行并发非重叠写入可能会起作用(?)。

在 HDF5 的最新版本中,应该支持虚拟数据集。每个进程都会将输出写入不同的文件,然后会创建一个新的容器文件,其中包含对各个数据文件的引用(但可以像普通 HDF5 文件一样读取)。

MPI 存在一个“Parallel HDF5”库。尽管 MPI 可能看起来有点大材小用,但如果以后扩展到多台机器,它会具有优势。

如果写入输出不是性能瓶颈,则多线程应用程序可能会实现一个输出线程(利用某种形式的队列数据结构)。

[编辑:] 另一种选择是使用zarr格式,它将每个块放在一个单独的文件中(HDF 的未来版本目前似乎可能采用这种方法)。