【问题标题】: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 的未来版本目前可能会采用这种方法)。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-26
        • 2020-04-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多