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

jit*_*hsk 9 fortran

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

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

这里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

谢谢你的帮助.

mil*_*cic 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)
Run Code Online (Sandbox Code Playgroud)

编辑:经过一番调查,这似乎是一个gfortran问题.为整数设置更高的类型可以reclen解决ifort和pgf90的问题,但不能解决gfortran的问题 - 我只是尝试使用版本4.6.2.即使reclen具有正确的正值,它似乎recl是内部使用gfortran的32位有符号整数(感谢@MSB指出这一点).Fortran运行时错误表明了这一点,而不是该值大于最大值.我怀疑这是一个操作系统问题.如果可能,请尝试使用ifort(免费用于非商业用途):英特尔非商业软件下载.

  • 只是添加这个:`sizeof`返回字节数,`recl`不一定是字节,所以`inquire`是正确的方法. (5认同)
  • FWIW,这是GFortran bug#44292,请参阅http://gcc.gnu.org/bugzilla/show_bug.cgi?id=44292 (2认同)