我有一个fortran代码需要读取一系列ascii数据文件(它们一起大约是25 Gb)。基本上,代码打开给定的ascii文件,读取信息并使用它来执行某些操作,然后关闭它。然后打开另一个文件,读取信息,执行一些操作,然后再次关闭它。等等其余的ascii文件。
总体而言,每次完整运行大约需要10小时。我通常需要使用不同的参数运行几个独立的计算,我的方法是按顺序运行每个独立的计算,这样如果我有10个独立的计算,那么总的CPU时间是100h。
更快的方法是在群集机器上使用不同的处理器同时运行10个独立的计算,但问题是如果给定的计算需要打开并从给定的ascii文件读取数据已经打开,并且它被另一个计算使用,那么代码显然会出现错误。
我想知道是否有办法验证给定的ascii文件是否已被另一个计算使用,如果是,请让代码等到ascii文件最终关闭。
任何帮助都会有很大的帮助。 非常感谢提前。
Obamakoak。
答案 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
现在,数据文件再次针对其他进程解锁。
我希望这可能对其他有同样问题的人有用。