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

时间:2016-01-20 17:29:26

标签: anaconda hdf5

我正在尝试理解hdf5并发的限制。

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

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

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

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

2 个答案:

答案 0 :(得分:15)

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

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

也就是说,--enable-threadsafe--enable-parallel标志是互斥的(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集团重组了他们的网站。 "Questions about thread-safety and concurrent access"中有一个页面HDF5 Knowledge Base,其中包含一些有用的信息。

虽然段落中只提到了单个进程上的并发线程,但它似乎同样适用于分叉子进程:请参阅此h5py multiprocessing example

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

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

  

目前尚未测试或支持线程安全版本的HDF5   在MS Windows平台上。用户能够开展此工作   Windows 64位并贡献了他的Windows 64位Pthreads补丁。

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

答案 1 :(得分:4)

添加: 我认为进行读访问的独立并发进程(即python)应该是fine

HDF5 1.10将支持Single Writer Multiple Readermore infos以及h5py 2.5.0将支持support