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

Posted

技术标签:

【中文标题】我可以从多个进程/线程写入 HDF5 文件吗?【英文标题】:Can I write to a HDF5 file from multiple processes/threads? 【发布时间】:2018-07-17 03:07:35 【问题描述】:

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

如果是这样,那么 NetCDF4 是否也支持这一点,并且两者的 python 绑定也支持?

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

【问题讨论】:

【参考方案1】:

并非微不足道,但有各种潜在的解决方法。

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

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

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

存在用于 MPI 的“Parallel HDF5”库。尽管 MPI 在其他方面可能看起来有点矫枉过正,但如果稍后扩展到多台机器上,它会更有优势。

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

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

【讨论】:

【参考方案2】:

如果您在 AWS 中运行,请查看 HDF Cloud:https://www.hdfgroup.org/solutions/hdf-cloud。

这是一项支持多个读取器/多个写入器工作流的服务,并且在很大程度上与 HDF5 库功能兼容。 客户端 SDK 不支持非阻塞写入,但当然,如果您直接使用 REST API,您可以像使用任何基于 http 的服务一样执行非阻塞 I/O。

【讨论】:

以上是关于我可以从多个进程/线程写入 HDF5 文件吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件

h5py 可以从内存中的字节数组加载文件吗?

多个线程同时写入多个文件 - 它正被另一个进程使用

从多个线程写入静态数据实际上是不是安全

将多个数据集读/写到单个 HDF5 文件

使用来自多个进程的 fseek/fwrite 写入文件的不同区域?