我试图理解hdf5并发的限制.
有两个版本的hdf5:并行HDF5和默认值.并行版本目前在Ubuntu中提供,默认在Anaconda中(由"--enable-parallel"标志判断).
我知道并行写入同一个文件是不可能的.但是,我不完全理解默认情况下或使用并行构建可以扩展以下操作:
此外,有没有任何理由anaconda默认没有--enable-parallel标志?(https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)
小智 16
AFAICT,有三种方法可以构建libhdf5:
conda您发布的配方)也就是说,--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在那些支持它的平台上,但我猜你最终会遇到特定于平台的行为.也许应该为这三种构建模式分别打包?
| 归档时间: |
|
| 查看次数: |
6988 次 |
| 最近记录: |