我正在尝试理解hdf5并发的限制。
hdf5有两个版本:并行HDF5 和默认。并行版本目前在Ubuntu中提供,默认在Anaconda中(由“--enable-parallel”标志判断)。
我知道并行写入同一个文件是不可能的。但是,我不完全理解默认情况下或使用并行构建可以扩展以下操作:
此外,有没有任何理由anaconda默认情况下没有--enable-parallel标志? (https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)
答案 0 :(得分:15)
AFAICT,有三种方法可以构建libhdf5:
conda
食谱)也就是说,--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 Reader,more infos以及h5py 2.5.0将支持support