fortran:等待打开文件,直到另一个应用程序关闭

时间:2013-09-18 09:45:25

标签: fortran

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

总体而言,每次完整运行大约需要10小时。我通常需要使用不同的参数运行几个独立的计算,我的方法是按顺序运行每个独立的计算,这样如果我有10个独立的计算,那么总的CPU时间是100h。

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

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

任何帮助都会有很大的帮助。 非常感谢提前。

Obamakoak。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

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

  • 进程使用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
    
  • 该文件现在由当前进程专门打开。做你需要做的操作,比如阅读,写作。

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

    textureVeryices
  • 现在,数据文件再次针对其他进程解锁。

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