【问题标题】:Can I write to a HDF5 file from multiple processes/threads?我可以从多个进程/线程写入 HDF5 文件吗?
【发布时间】:2018-07-17 03:07:35
【问题描述】:
hdf5 是否支持从不同线程或不同进程并行写入同一文件?或者,hdf5 是否支持非阻塞写入?
如果是这样,那么 NetCDF4 是否也支持这一点,并且两者的 python 绑定也支持?
我正在编写一个应用程序,我希望不同的 CPU 内核同时计算输出,用于非常大的输出数组的非重叠切片。 (稍后我将希望从它作为单个数组读取部分,而不需要我自己的驱动程序来管理对许多单独文件的索引,并且理想情况下不需要在磁盘上重新排列它的额外 IO 任务。)
【问题讨论】:
标签:
python
parallel-processing
bigdata
hdf5
netcdf4
【解决方案1】:
并非微不足道,但有各种潜在的解决方法。
普通的HDF5库显然甚至不支持多线程并发读取不同的文件。因此,NetCDF4 以及它们的 python 绑定将不支持并行写入。
如果输出文件是预先初始化的并且禁用了分块和压缩,以避免有一个块索引,那么(原则上)不同进程对同一文件的并发非重叠写入可能会起作用(?)。
在 HDF5 的更新版本中,应该支持虚拟数据集。每个进程都会将输出写入不同的文件,然后会创建一个新的容器文件,其中包含对各个数据文件的引用(但可以像普通 HDF5 文件一样读取)。
存在用于 MPI 的“Parallel HDF5”库。尽管 MPI 在其他方面可能看起来有点矫枉过正,但如果稍后扩展到多台机器上,它会更有优势。
如果写入输出不是性能瓶颈,多线程应用程序可能会实现一个输出线程(利用某种形式的队列数据结构)。
[编辑:] 另一种选择是改用zarr 格式,它将每个块放在一个单独的文件中(HDF 的未来版本目前可能会采用这种方法)。