Fortran I / O:指定大记录大小

时间:2012-01-26 03:30:57

标签: fortran

我正在尝试将数组写入文件,我以这种方式打开文件:

open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u))

此处,u是一个数组,sizeof(u)是2730025920,约为2.5GB。 当我运行程序时,出现错误Fortran runtime error: RECL parameter is non-positive in OPEN statement,我认为这意味着记录大小太大。

有办法解决这个问题吗?一种选择是在多个写调用中写入数组,使得每次写入中的记录大小小于2.5GB。但我想知道我是否可以在一次通话中编写整个阵列。

编辑: u已被声明为double precision u(5,0:408,0:408,0:407) 该程序编译为gfortran -O3 -fopenmp -mcmodel=medium test.f 这个程序中有一些OpenMP代码,但文件I / O是顺序的。

gfortran v 4.5.0,操作系统:在64位AMD Opteron上打开11.3

感谢您的帮助。

1 个答案:

答案 0 :(得分:17)

只要内存允许,你就应该能够编写大数组。看起来你正在使用sizeof函数获得整数溢出。 sizeof不是Fortran标准,我不建议使用它(实现可能因编译器而异)。相反,使用inquire语句获取记录长度是一种更好的做法。我能够用ifort重现你的问题,这个解决方案适合我。您可以通过声明更高的类型变量来避免整数溢出:

integer(kind=8) :: reclen

inquire(iolength=reclen)u 

open(unit=20,file='output.txt',form='unformatted',&
     access='direct',recl=reclen)
编辑:经过一番调查,这似乎是个问题。为整数reclen设置更高的类型可以解决ifort和pgf90的问题,但不能解决gfortran的问题 - 我只是尝试使用版本4.6.2。尽管reclen具有正确的正值,但recl内部似乎是带有gfortran的32位有符号整数(感谢@ M.S.B。指出这一点)。 Fortran运行时错误表明了这一点,而不是该值大于最大值。我怀疑这是一个操作系统问题。如果可能,请尝试使用ifort(免费用于非商业用途):Intel Non-Commercial Software Download