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

2024-02-08

我试图了解 HDF5 并发的限制。

HDF5 有两种版本:并行HDF5 and default。目前 Ubuntu 中提供了并行版本,Anaconda 中默认提供(通过判断)--enable-parallel flag).

我知道并行写入同一文件是不可能的。但是,我不完全理解默认或并行构建可以在多大程度上执行以下操作:

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

另外,anaconda 默认情况下没有 --enable-parallel 标志是否有任何原因? (https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh https://github.com/conda/conda-recipes/blob/master/hdf5/build.sh)


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在那些支持它的平台上,但我想你最终会得到特定于平台的行为。也许应该为三种构建模式提供单独的包?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 将带有空值的 csv 文件导入 phpmyadmin

    当我将 csv 文件导入 MySQL phpmyadmin 时 对于文件中未指定但默认值为 null 的所有整数值 会出现一条错误消息 1366 Incorrect integer value for column id at row 1
  • 如果删除的单元仍在其他单元中使用,那么如果我清理我的使用条款,会有什么不同吗?

    就我个人而言 我喜欢它 如果我的uses子句尽可能小 但在许多应用程序中 真正大的单元 就膨胀的可执行文件而言 就像Forms or VirtualTrees无论如何 至少另一个单位需要 所以 如果我清洁我的身体 会有什么不同吗 uses即
  • 在 R 中添加带有颜色和范围的图例

    以下示例代码根据以下值生成彩色点图a a lt sample 1 100 rbPal lt colorRampPalette c red blue b lt rbPal 10 as numeric cut a breaks 10 plot
  • python 的startswith 是如何工作的?

    我无法理解该行为str startswith https docs python org 3 library stdtypes html str startswith method 如果我执行 hello startswith 它返回 Tr
  • 线程会提高性能吗?

    我有一个这样设置的程序 它是一个 Net Framework 4 控制台应用程序 该程序用于从每台服务器上的每个日志文件 上周 收集 sc 字节和 cs 字节 该程序已完成 但运行时间很长 foreach string server in
  • 在 Rails 3 中编写自定义验证器

    我正在尝试编写一个自定义验证器来检查输入到文本字段中的单词数 我试图效仿 Railscasts 第 211 集中的例子 http railscasts com episodes 211 validations in rails 3 http
  • CSS margin 和 padding 简写属性的顺序助记符

    我永远记不起在一个声明中设置边距或填充的速记属性的顺序 那是 margin top 2px margin bottom 4px margin left 3px margin right 8px 可以写成 margin 2px 8px 4px
  • 如何在OpenCV中将某个RGB值的所有像素替换为另一个RGB值

    我需要能够用 OpenCV 中的另一种颜色替换具有特定 RGB 值的所有像素 我尝试了一些解决方案 但没有一个对我有用 实现这一目标的最佳方法是什么 太长了 使用 Numpy 将所有绿色像素设为白色 import numpy as np p
  • FXCop 自定义规则未显示在规则集中

    我按照此处的步骤创建了一个新的自定义规则并将其添加到 VSStudio 2013 中的规则集中 http blog tatham oddie com au 2010 01 06 custom code analysis rules in v
  • 在 Word 选项加载项对话框中设置发布者

    我使用 Visual Studio 2010 RTM 为 Microsoft Word 2010 Beta 制作了一个插件 当我查看 查看和管理 Microsoft Office 加载项 时 发布者显示为 无 使用软件发布者证书进行代码签名
  • jquery更改事件回调

    如何在之后调用函数一次change 活动完成了吗 例如 像这样 我知道 jQuery 默认没有回调方法 element change function do something on change milestonesSelect mult
  • 你能结合 docker 的单独构建吗?

    我正在使用circleci来部署应用程序 我部署到amd和arm架构 所以我的构建是多架构的 我一直在使用docker buildx 借助 Circleci 的新手臂支持 我能够将这个过程的时间从使用 quemu 的有时 3 小时缩短到大约
  • SQL Server 版本控制与 git 集成?

    我有一个 ERP 系统 由我的团队负责维护 然而最近我们似乎忘记了谁在改变什么 我们需要一个解决方案来控制这些变化 我们正在研究 GIT 的企业版 因为我们所有的软件开发和 Web 开发都可以与它完美配合 更不用说我已经有一些 GIT 经验
  • 获取所有 css 样式属性的访问权限?

    我想通过 JavaScript 访问所有 CSS 属性 不仅针对特定选择器或元素 而且针对所有属性 我想遍历所有属性 style收藏 我怎样才能做到这一点 您可以使用CSSStyleDeclaration object CSSStyleDe
  • Floyd Warshall 使用邻接表

    是否可以使用邻接表对 Floyd Warshall 进行编码 我必须处理文本文件中的一百万个顶点 因此邻接矩阵不是解决方案 已有可用的实施吗 请帮忙 您不能将 Floyd Warshall 与邻接列表一起使用 因为当它工作时 它会产生新的边
  • 为什么我的数据库没有更新?

    我的问题是 当我编辑数据网格中的单元格时 数据库没有更新 我使用的代码如下 Public Class Form9 Inherits System Windows Forms Form Dim sql As String SELECT FRO
  • |= 运算符在 C++ 中意味着什么?

    运算符在 C 中意味着什么 假设您在整数上使用内置运算符 或在用户定义的类上使用合理重载的运算符 则这些运算符是相同的 a a b a b The 符号是按位或赋值运算符 它计算右侧 b 与左侧 a 的 或 值 并将结果分配给 a 但在执行
  • 在类路径中查找重复的类

    我有一个使用 Maven 构建的 Java 应用程序 它有很多依赖项 当执行我的测试用例时 它们有时会很好地通过 有时会因为一些不兼容的类组合而失败 所以看来类路径中必须有一些类两次是随机选取的 一个很好 另一个则不好 如何找出我的类路径中
  • 计算三角形内的格点

    我有一个大三角形的点 我们称之为 a b c a x y 等 现在我想统计这个三角形围成的区域内有多少个积分点 所以我首先看一下皮克定理 我考虑的第二种方法是生成一个以三角形的最大值 最小值为界的点列表 然后检查每个点是否位于三角形内部 我
  • HDF5 是否支持并发读取或写入不同的文件?

    我试图了解 HDF5 并发的限制 HDF5 有两种版本 并行HDF5 and default 目前 Ubuntu 中提供了并行版本 Anaconda 中默认提供 通过判断 enable parallel flag 我知道并行写入同一文件是不