在 FORTRAN / MPI / HDF5 ( 1.10.1 ) 中使用 h5fopen_f 打开文件时出错

Posted

技术标签:

【中文标题】在 FORTRAN / MPI / HDF5 ( 1.10.1 ) 中使用 h5fopen_f 打开文件时出错【英文标题】:Error opening a file with h5fopen_f in FORTRAN / MPI / HDF5 ( 1.10.1 ) 【发布时间】:2018-05-21 15:58:12 【问题描述】:

我正在使用使用 HDF5 (1.10.1) 的 Fortran 代码。在某些时候,会调用使用h5fopen_f 打开文件:

H5FileName = "+hdf5/Temperature_00000_00001.h5"
CALL h5fopen_f(H5FileName, H5F_ACC_RDWR_F, file, hdferr)
Scalardataset = 'Temperature_00001_0000'
call h5ltget_dataset_info_f(file, Scalardataset, dimstmp, type_class, type_size, hdferr)
call h5fclose_f(file,hdferr)

这给了我一个错误:

HDF5-DIAG: Error detected in HDF5 (1.10.1) MPI-process 0:
  #000: H5F.c line 586 in H5Fopen(): unable to open file
    major: File accessibilty
    minor: Unable to open file
  #001: H5Fint.c line 1305 in H5F_open(): unable to lock the file
    major: File accessibilty
    minor: Unable to open file
  #002: H5FD.c line 1839 in H5FD_lock(): driver lock request failed
    major: Virtual File Layer
    minor: Can't update object
  #003: H5FDsec2.c line 940 in H5FD_sec2_lock(): unable to lock file, errno = 11, error message = 'Resource temporarily unavailable'
    major: File accessibilty
    minor: Bad file ID accessed

我已经检查了该文件是否存在,它应该在哪里,并且我拥有正确的权限。此外,当我只使用一个进程时,代码工作正常,当我使用多个进程时,其中一个进程能够打开文件(err=0),但其余进程不能(err=-1)。最后,我在其他地方安装了相同的代码,它工作得很好(版本 1.8.14)。

这可能是版本的问题吗?

【问题讨论】:

这个文件真的存在吗?路径是否正确?请提供minimal reproducible example。 看起来您正试图锁定罚款同时在多个进程上打开它。但是,正如@VladimirF 所说,我们需要查看代码。 @VladimirF,@Ross。我已经编辑了原始帖子以包含代码的 sn-p。对于那个很抱歉。正如我所提到的,该文件存在并且路径正确我已经设法通过以只读方式打开它来解决它,使用H5F_ACC_RDONLY_F 而不是H5F_ACC_RDWR_F。但是当我使用 1.8.14 版本时,我不需要这样做。知道这是为什么吗? 通过 python 和 1.10.1 出现类似问题:无法打开/创建文件 '/Users/klay6683/local_data/2017-12-31_planet_four_classifications_queryable.h5' [0:apply]: OSError: HDF5 error回溯 文件“H5F.c”,第 586 行,在 H5Fopen 中无法打开文件 文件“H5Fint.c”,第 1305 行,在 H5F_open 中无法锁定文件 文件“H5FD.c”,第 1839 行,在 H5FD_lock 驱动程序锁定请求中失败的文件“H5FDsec2.c”,第 940 行,在 H5FD_sec2_lock 中无法锁定文件,errno = 35,错误消息 = '资源暂时不可用' HDF5 错误回溯结束。 HDF5 1.8.18 运行良好。 【参考方案1】:

我找到了两种解决方法:

以只读方式打开文件,使用H5F_ACC_RDONLY_F 而不是H5F_ACC_RDWR_F(这对我来说很好,因为我不需要写。 使用HDF5 1.8.14 重新编译所有内容。我猜想 1.10.x 版本的读写权限比 1.8.x 版本更严格。

理想情况下,我希望能够将HDF5 的更新版本与H5F_ACC_RDWR_F 一起使用,但现在它适用于我。

【讨论】:

【参考方案2】:

我在 HDF5 1.10.1 中遇到了非常相似的问题。我们正在使用多个阅读器以 H5F_ACC_RDONLY 模式访问文件。

通过设置环境变量禁用文件锁定似乎可以解决H5FDsec2.c line 940 in H5FD_sec2_lock(): unable to lock file, errno = 11, error message = 'Resource temporarily unavailable'

export HDF5_USE_FILE_LOCKING="FALSE"

hdf5 在运行时检查此环境变量。见:https://support.hdfgroup.org/ftp/HDF5/current/src/unpacked/release_docs/RELEASE.txt​

【讨论】:

以上是关于在 FORTRAN / MPI / HDF5 ( 1.10.1 ) 中使用 h5fopen_f 打开文件时出错的主要内容,如果未能解决你的问题,请参考以下文章

在 Fortran 中获取 HDF5 文件名的长度?

在 fortran 中将写入附加到 hdf5 文件

HDF5:构建 Fortran 库 (Windows)

链接静态 HDF5 Fortran 库

在 Fortran 中读取 HDF5 数据集的子集时出现问题

通过 mpi_f08 模块和 gfortran 支持 MPI Fortran