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

时间:2018-02-06 23:07:48

标签: python parallel-processing bigdata hdf5 netcdf4

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

如果是这样,NetCDF4还支持python绑定吗?

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

2 个答案:

答案 0 :(得分:2)

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

普通的HDF5库显然甚至不支持多个线程对不同文件的并发读取。因此,NetCDF4和其中任何一个的python绑定都不支持并行写入。

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

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

存在"并行HDF5" MPI库。虽然MPI可能看起来有点矫枉过正,但如果稍后扩展到多台机器,它将具有优势。

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

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

答案 1 :(得分:0)

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

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