AFAICT,构建 libhdf5 有三种方法:
- 既没有线程安全也没有 MPI 支持(如
conda
你发布的食谱)
- 有 MPI 支持,但没有线程安全
- 具有线程安全但不支持 MPI
那就是--enable-threadsafe
and --enable-parallel
标志是互斥的(https://www.hdfgroup.org/hdf5-quest.html#p5thread https://www.hdfgroup.org/hdf5-quest.html#p5thread).
至于并发读取一个甚至多个文件,答案是需要线程安全(https://www.hdfgroup.org/hdf5-quest.html#tsafe https://www.hdfgroup.org/hdf5-quest.html#tsafe):
从多个线程并发访问一个或多个 HDF5 文件
相同的进程不适用于非线程安全的构建
HDF5 库。可供下载的预构建二进制文件
不是线程安全的。
用户常常惊讶地发现 (1) 并发访问
单个 HDF5 文件中的不同数据集和 (2)并发访问
不同的 HDF5 文件都需要 HDF5 的线程安全版本
图书馆。尽管这些示例中的每个线程都访问不同的
数据,该HDF5 库修改了全局数据结构
独立于特定的 HDF5 数据集或 HDF5 文件。 HDF5 依赖于
线程安全版本中围绕库 API 调用的信号量
该库通过以下方式保护数据结构免遭损坏
来自不同线程的同时操作。 HDF5 的示例
必须保护的库全局数据结构是
可用空间管理器和打开文件列表。
Edit:由于 HDF Group 重组了其网站,上述链接不再有效。有一个页面关于线程安全和并发访问的问题 https://portal.hdfgroup.org/display/knowledge/Questions+about+thread-safety+and+concurrent+access in the HDF5 知识库 https://portal.hdfgroup.org/display/knowledge/HDF+Knowledge+Base其中包含一些有用的信息。
虽然本文中只提到了单个进程上的并发线程,但它似乎同样适用于分叉子进程:请参阅此 h5py多处理示例 https://github.com/h5py/h5py/blob/master/examples/multiprocessing_example.py.
现在,为了parallel访问时,您可能想要使用“并行 HDF5”,但这些功能需要使用 MPI。该模式由以下支持h5py http://docs.h5py.org/en/latest/mpi.html但更复杂、更深奥,甚至可能比线程安全模式更难移植。更重要的是,尝试天真地使用 libhdf5 的并行构建进行并发读取将导致意外结果,因为该库不是线程安全的.
除了效率之外,线程安全构建标志的一个限制是缺乏 Windows 支持(https://www.hdfgroup.org/hdf5-quest.html#gconc https://www.hdfgroup.org/hdf5-quest.html#gconc):
目前尚未测试或支持 HDF5 的线程安全版本
在 MS Windows 平台上。用户能够让这个工作正常进行
Windows 64 位并贡献了他的 Windows 64 位 Pthreads 补丁。
考虑到并发读取访问是 HDF5 备受推崇的“功能”之一,从 Python 读取(不同的!)文件时获得奇怪的损坏结果绝对是意料之外且令人沮丧的。也许 conda 更好的默认配方是包括--enable-threadsafe
在那些支持它的平台上,但我想你最终会得到特定于平台的行为。也许应该为三种构建模式提供单独的包?