Anaconda HDF5是否支持对不同文件的并发读取或写入?

Anaconda HDF5是否支持对不同文件的并发读取或写入?,anaconda,hdf5,Anaconda,Hdf5,我试图理解HDF5并发性的限制 HDF5有两种版本:并行HDF5和默认版本。并行版本目前在Ubuntu中提供,默认版本在Anaconda中(由--enable parallel标志判断) 我知道并行写入同一个文件是不可能的。但是,我不完全理解以下操作在默认情况下或并行构建情况下的可能范围: 从同一文件读取的多个进程 从不同文件读取的多个进程 多个进程写入不同的文件 另外,anaconda在默认情况下没有启用并行标志有什么原因吗?()AFAICT,构建libhdf5有三种方法: 既不支持线程

我试图理解HDF5并发性的限制

HDF5有两种版本:并行HDF5和默认版本。并行版本目前在Ubuntu中提供,默认版本在Anaconda中(由
--enable parallel
标志判断)

我知道并行写入同一个文件是不可能的。但是,我不完全理解以下操作在默认情况下或并行构建情况下的可能范围:

  • 从同一文件读取的多个进程
  • 从不同文件读取的多个进程
  • 多个进程写入不同的文件

另外,anaconda在默认情况下没有启用并行标志有什么原因吗?()

AFAICT,构建libhdf5有三种方法:

  • 既不支持线程安全,也不支持MPI(如您发布的
    conda
    配方)
  • 具有MPI支持,但没有线程安全性
  • 具有线程安全性,但不支持MPI
也就是说,
--enable threadsafe
--enable parallel
标志是互斥的()

对于一个甚至多个文件的并发读取,答案是需要线程安全():

从中的多个线程并发访问一个或多个HDF5文件 同一进程不适用于非线程安全的 HDF5库。可供下载的预构建二进制文件 不是线程安全的

用户经常惊讶地发现(1)并发访问 单个HDF5文件中的不同数据集和(2)对 不同的HDF5文件都需要HDF5的线程安全版本 库。虽然这些示例中的每个线程访问不同的 数据,HDF5库修改 独立于特定的HDF5数据集或HDF5文件。HDF5依赖于 线程安全版本中库API调用周围的信号量 该库通过以下方式保护数据结构不受损坏: 来自不同线程的同时操作。HDF5的示例 必须保护的库全局数据结构是 释放空间管理器和打开文件列表

编辑:由于HDF小组重新组织了他们的网站,上述链接不再有效。中有一个页面包含一些有用的信息

虽然在本文中只提到了单个进程上的并发线程,但它似乎同样适用于分叉子进程:请参见此图

现在,对于并行访问,您可能希望使用“并行HDF5”,但这些特性需要使用MPI。此模式由支持,但更复杂、更深奥,甚至可能比线程安全模式更不可移植。更重要的是,尝试使用并行构建的libhdf5进行并发读取将导致意外的结果,因为库不是线程安全的

除了效率,线程安全构建标志的一个限制是缺少Windows支持():

目前未测试或支持HDF5的线程安全版本 在MS Windows平台上。一个用户能够让它工作 Windows 64位和贡献了他的Windows 64位Pthreads补丁

从Python中读取(不同的!)文件时会出现奇怪的损坏结果,这显然是出乎意料的,而且令人沮丧的,因为并发读取访问是HDF5的一个被吹捧的“特性”。对于conda来说,一个更好的默认方法可能是在支持它的平台上包含
--启用线程安全
,但我想这样你就会得到特定于平台的行为。也许应该为这三种构建模式提供单独的软件包?

只需添加: 我认为进行读访问的独立并发进程(即python)应该是


HDF5 1.10将支持,h5py 2.5.0也将支持它

这也是我们的结论,只有一个例外。如果文件至少在一个进程中打开以进行写入/追加,则您无法从其他进程读取文件(即使写入进程处于空闲状态)。首先,链接断开您可能已经意识到这一点,但还有一个Zarr,它似乎同时支持多线程读取和写入:是的。我们的基准测试速度快了两倍!Zarr真是太棒了。我编辑了你的优秀答案,在相关的HDF5知识库页面上添加了新的链接。就像现在Windows也支持线程安全版本一样。