HDF5 是不是支持并发读取或写入不同文件?
Posted
技术标签:
【中文标题】HDF5 是不是支持并发读取或写入不同文件?【英文标题】:Does HDF5 support concurrent reads, or writes to different files?HDF5 是否支持并发读取或写入不同文件? 【发布时间】:2016-04-26 16:32:13 【问题描述】:我正在尝试了解 HDF5 并发的限制。
HDF5 有两种构建:并行 HDF5 和 默认。并行版本目前在 Ubuntu 中提供,在 Anaconda 中提供默认版本(由--enable-parallel
标志判断)。
我知道并行写入同一个文件是不可能的。但是,我不完全理解默认或并行构建可以扩展以下操作:
从同一个文件中读取的多个进程 从不同文件读取的多个进程 多个进程写入不同的文件。另外,anaconda 默认没有启用 --enable-parallel 标志是否有任何原因? (https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)
【问题讨论】:
您现在可能已经意识到这一点,但还有 Zarr 似乎同时支持多线程读写:alimanfoo.github.io/2016/05/16/cpu-blues.html 是的。在我们的基准测试中快两倍! Zarr 确实很棒。 【参考方案1】: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 集团重组了他们的网站。在HDF5 Knowledge Base 中有一个页面Questions about thread-safety and concurrent access,其中包含一些有用的信息。
虽然文章中只提到了单个进程上的并发线程,但它似乎同样适用于分叉的子进程:请参阅此 h5py multiprocessing example。
现在,对于并行访问,您可能希望使用“Parallel HDF5”,但这些功能需要使用 MPI。 h5py 支持此模式,但更复杂和深奥,甚至可能比线程安全模式更不便携。更重要的是,尝试使用并行构建的 libhdf5 天真地进行并发读取会导致意外结果,因为 该库不是线程安全的。
除了效率之外,线程安全构建标志的一个限制是缺乏 Windows 支持 (https://www.hdfgroup.org/hdf5-quest.html#gconc):
目前未测试或支持 HDF5 的线程安全版本 在 MS Windows 平台上。用户能够得到这个工作 Windows 64 位并贡献了他的 Windows 64 位 Pthreads 补丁。
考虑到并发读取访问是 HDF5 吹捧的“功能”之一,从 Python 读取(不同!)文件时得到奇怪的损坏结果绝对是出乎意料和令人沮丧的。也许 conda 的一个更好的默认方法是在支持它的那些平台上包含 --enable-threadsafe
,但我想你最终会得到特定于平台的行为。也许这三种构建模式应该有单独的包?
【讨论】:
我对您的出色答案进行了一些编辑,添加了指向相关 HDF5 知识库页面的新链接。 它seems 就像现在 Windows 也支持线程安全构建。【参考方案2】:只需添加: 我认为进行读取访问的独立并发进程(即python)应该是fine
HDF5 1.10 将支持 Single Writer Multiple Reader,more infos 并且 h5py 2.5.0 将支持 support
【讨论】:
这也是我们的结论,但有一个例外。如果文件在至少一个进程中打开以写入 /append,则您无法从其他进程读取文件(即使写入进程处于空闲状态)。 第一个链接断开以上是关于HDF5 是不是支持并发读取或写入不同文件?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C++ API 在 HDF5 文件中写入/读取锯齿状数组?
使用来自 Python 的 1 个进程使用 HDF5 和 MPI 写入/读取大文件