2

我有一个 fortran 代码,它需要读取一系列 ascii 数据文件(总共大约 25 Gb)。基本上,代码打开一个给定的 ascii 文件,读取信息并使用它来执行一些操作,然后关闭它。然后打开另一个文件,读取信息,做一些操作,然后再次关闭。其余的 ascii 文件依此类推。

总体而言,每次完整运行大约需要 10 小时。我通常需要运行几个不同参数的独立计算,我的做法是依次运行每个独立计算,这样最后如果我有10个独立计算,总的CPU时间是100h。

更快速的方法是在集群机器上使用不同的处理器同时运行 10 个独立的计算,但问题是,如果给定的计算需要打开并从已经打开的给定 ascii 文件中读取数据,并且它被另一个计算使用,那么代码显然给出了一个错误。

我想知道是否有办法验证给定的 ascii 文件是否已被另一个计算使用,如果是,则要求代码等到 ascii 文件最终关闭。

任何帮助都会有很大帮助。提前谢谢了。

奥巴马科克。

4

2 回答 2

1

两个进程应该能够读取同一个文件。也许action="read"关于公开声明可能会有所帮助。文件必须是人类可读的吗?对于未格式化(有时称为二进制)文件,I/O 很可能会快得多。

PS 如果您的操作系统不支持多读访问,您可能需要创建自己的锁定系统。创建一个进程打开的主文件,以检查哪些文件正在使用或未使用,并更新所述列表。检查或更新后立即关闭。要处理此读/写文件iostat上的冲突,请使用 open 语句,如果出现错误,请在延迟后重试。

于 2013-09-18T10:09:27.507 回答
1

我知道这是一个旧线程,但我一直在为自己的代码解决同样的问题。

我的第一次尝试是在某个进程(例如主进程)上创建一个变量,并使用单面被动 MPI 专门访问这个变量。这很花哨并且效果很好,但仅适用于较新版本的 MPI。

此外,我的代码似乎很乐意打开(带有READWRITE状态)在其他进程中也打开的文件。

因此,如果您的程序具有文件访问权限,最简单的解决方法是使用外部锁定文件,如此所述。在您的情况下,代码可能如下所示:

  • 进程使用语句检查锁定文件是否存在NEW,如果文件已存在,则该语句失败。它看起来像:

    file_exists = .true.
    do while (file_exists)
        open(STATUS='NEW',unit=11,file=lock_file_name,iostat=open_stat)
        if (open_stat.eq.0) then
            file_exists = .false.
            open(STATUS='OLD',ACTION=READWRITE',unit=12,file=data_file_name,iostat=ierr)
            if (ierr.ne.0) stop
        else
            call sleep(1)
        end if
    end do
    
  • 该文件现在由当前进程独占打开。做你需要做的操作,比如读、写。

  • 完成后,关闭数据文件,最后关闭锁定文件

    close(12,iostat=ierr)
    if (ierr.ne.0) stop
    close(11,status='DELETE',iostat=ierr)
    if (ierr.ne.0) stop
    
  • 数据文件现在再次为其他进程解锁。

我希望这可能对其他有同样问题的人有用。

于 2015-10-05T08:47:53.390 回答