首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HDF5是否支持并发读取或写入不同的文件?

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

Stack Overflow用户
提问于 2016-01-20 17:29:25
回答 2查看 13.1K关注 0票数 22

我试图理解HDF5并发的局限性。

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

我知道对同一个文件进行并行写入是不可能的。但是,我不完全理解在默认或并行构建中可以扩展以下操作:

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

此外,在默认情况下,anaconda没有--启用--并行标志有什么原因吗?(https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-01-21 00:22:52

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知识库,其中包含一些有用的信息。

虽然在文章中只提到单个进程上的并发线程,但它似乎同样适用于分叉子进程:参见此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,但我想您最终会出现特定于平台的行为。也许这三种构建模式应该有单独的包来代替?

票数 21
EN

Stack Overflow用户

发布于 2016-01-24 20:45:26

我只是想补充一点:我认为独立的并发进程(即python)进行读访问应该是很好

HDF5 1.10将支持单作者多读取器更多信息,而h5py 2.5.0也将为其提供支持

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34906652

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档