我正在尝试将数组写入文件,我以这种方式打开文件:
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
感谢您的帮助。
答案 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。