hdf5是否支持从同一个文件,不同线程或不同进程并行写入?或者,hdf5是否支持非阻塞写入?
如果是这样,NetCDF4还支持python绑定吗?
我正在编写一个应用程序,我希望不同的CPU内核同时计算用于非重大输出数组的非重叠切片的输出。 (稍后我会想要将它作为单个数组读取,而不需要我自己的驱动程序来管理索引许多单独的文件,理想情况下没有额外的IO任务在磁盘上重新安排它。)
答案 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.