hdf5是否支持从不同线程或不同进程对同一文件进行并行写入?或者,hdf5是否支持非阻塞写入?
如果是这样,那么NetCDF4和python绑定是否也支持这一点呢?
我正在编写一个应用程序,其中我希望不同的CPU内核同时计算用于非常大的输出数组的非重叠瓦片的输出。(稍后,我希望将其作为单个数组来读取部分,而不需要我自己的驱动程序来管理对许多独立文件的索引,理想情况下也不需要在磁盘上重新排列这些文件的额外IO任务。)
发布于 2018-02-07 09:09:32
这不是微不足道的,而是有各种潜在的解决办法。
普通的HDF5库显然不支持多线程并发读取不同的文件。因此,NetCDF4和python绑定都不支持并行编写。
如果输出文件是预初始化的,并且禁用了分块和压缩,为了避免有分块索引,那么(原则上)由单独的进程对同一文件进行并发的非重叠写入可能是可行的(?)。
在较新版本的HDF5中,应该支持虚拟数据集。每个进程将输出写入不同的文件,然后创建一个新的容器文件,其中包含对各个数据文件的引用(但也可以像普通的HDF5文件一样读取)。
有一个用于MPI的“并行HDF5”库。尽管MPI在其他方面可能看起来有点过头,但如果以后扩展到多台机器,它将具有优势。
如果写入输出不是性能瓶颈,那么多线程应用程序可能会实现一个输出线程(利用某种形式的队列数据结构)。
编辑:另一种选择是使用zarr格式,它将每个块放在一个单独的文件中(这是HDF未来版本目前可能采用的一种方法)。
发布于 2018-02-07 10:03:10
如果你在亚马逊网络服务中运行,请查看HDF Cloud:https://www.hdfgroup.org/solutions/hdf-cloud。
这是一个支持多个读取器/多个写入器工作流的服务,并且在很大程度上与HDF5库的功能兼容。客户端SDK不支持非阻塞写入,但当然,如果您直接使用REST API,则可以像处理任何基于http的服务一样执行非阻塞I/O。
https://stackoverflow.com/questions/48653421
复制相似问题