hdf5是否支持并发读取或写入不同的文件?

Max*_*aev 19 hdf5 anaconda

我试图理解hdf5并发的限制.

有两个版本的hdf5:并行HDF5默认值.并行版本目前在Ubuntu中提供,默认在Anaconda中(由"--enable-parallel"标志判断).

我知道并行写入同一个文件是不可能的.但是,我不完全理解默认情况下或使用并行构建可以扩展以下操作:

  • 从同一个文件读取的几个进程
  • 从不同文件中读取的几个进程
  • 写入不同文件的几个进程.

此外,有没有任何理由anaconda默认没有--enable-parallel标志?(https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)

小智 16

AFAICT,有三种方法可以构建libhdf5:

  • 既没有线程安全也没有MPI支持(如conda您发布的配方)
  • 有MPI支持,但没有线程安全
  • 线程安全但没有MPI支持

也就是说,--enable-threadsafe--enable-parallelflags是互斥的(https://www.hdfgroup.org/hdf5-quest.html#p5thread).

对于一个甚至多个文件的并发读取,答案是你需要线程安全(https://www.hdfgroup.org/hdf5-quest.html#tsafe):

在同一进程中从多个线程同时访问一个或多个HDF5文件将无法与HDF5库的非线程安全版本一起使用.可供下载的预构建二进制文件不是线程安全的.

用户经常会惊讶地发现(1)在单个HDF5文件中并发访问不同数据集,以及(2)对不同HDF5文件的并发访问都需要HDF5库的线程安全版本.虽然这些示例中的每个线程都在访问不同的数据,但HDF5库会修改独立于特定HDF5数据集或HDF5文件的全局数据结构.HDF5依赖于库的线程安全版本中的库API调用的信号量,以通过来自不同线程的同时操作来保护数据结构免受损坏.必须保护的HDF5库全局数据结构的示例是自由空间管理器和打开文件列表.

编辑:上述链接不再有效,因为HDF集团重组了他们的网站.有一个页的"关于线程安全和并发访问的问题"HDF5知识库包含一些有用的信息.

虽然在段落中仅提及单个进程上的并发线程,但它似乎同样适用于分叉子进程:请参阅此h5py 多处理示例.

现在,对于并行访问,您可能希望使用"Parallel HDF5",但这些功能需要使用MPI.这种模式由h5py支持,但更复杂,更深奥,甚至可能比线程安全模式更不便携.更重要的是,尝试天真地使用并行构建的libhdf5进行并发读取将导致意外的结果,因为该库不是线程安全的.

除了效率之外,线程安全构建标志的一个限制是缺少Windows支持(https://www.hdfgroup.org/hdf5-quest.html#gconc):

目前,MS Windows平台上未测试或支持线程安全版本的HDF5.用户能够在Windows 64位上使用它并贡献了他的Windows 64位Pthreads补丁.

从Python读取(不同的!)文件时出现奇怪的损坏结果肯定是意外和令人沮丧的,因为并发读取访问是HDF5的一个被吹捧的"功能".对于conda来说,更好的默认配方可能是包含--enable-threadsafe在那些支持它的平台上,但我猜你最终会遇到特定于平台的行为.也许应该为这三种构建模式分别打包?

  • 有几件事 - 这里的所有链接现在都已损坏。“--enable-shared”和“--enable-parallel”仍然是互斥的吗?我看到很多其他安装指南都使用这两个标志。 (2认同)