我试图理解HDF5并发的局限性。
HDF5有两个版本:并行HDF5和default。并行版本目前是在Ubuntu中提供的,在Anaconda中是默认的(由--enable-parallel
标志判断)。
我知道对同一个文件进行并行写入是不可能的。但是,我不完全理解在默认或并行构建中可以扩展以下操作:
此外,在默认情况下,anaconda没有--启用--并行标志有什么原因吗?(https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)
发布于 2016-01-21 00:22:52
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组重组了他们的网站。关于线程安全和并发访问的问题中有一个页面HDF5知识库,其中包含一些有用的信息。
虽然在文章中只提到单个进程上的并发线程,但它似乎同样适用于分叉子进程:参见此h5py 多处理实例。
现在,对于并行访问,您可能希望使用“并行HDF5”,但是这些特性需要使用MPI。这种模式是由h5py支持的,但它更复杂、更深奥,而且可能比线程安全模式更不容易移植。更重要的是,试图天真地使用并行构建的libhdf5进行并发读取将导致意外的结果,因为库不是线程安全的。
除了效率之外,线程安全构建标志的一个限制是缺少Windows (https://www.hdfgroup.org/hdf5-quest.html#gconc):
HDF5的线程安全版本目前没有在MS平台上进行测试或支持。一个用户能够在Windows 64位上工作,并贡献了他的Windows 64位线程补丁程序。
阅读时会产生奇怪的腐败结果(不一样!)考虑到并发读取访问是HDF5被吹捧的“特性”之一,Python中的文件绝对是出乎意料和令人沮丧的。也许conda的一个更好的默认方法是在那些支持它的平台上包含--enable-threadsafe
,但我想您最终会出现特定于平台的行为。也许这三种构建模式应该有单独的包来代替?
https://stackoverflow.com/questions/34906652
复制相似问题