我正在尝试将一个数组写入文件,我以这种方式打开文件:
open(unit=20, FILE="output.txt", form='unformatted', access='direct', recl=sizeof(u))
Here, u
是一个数组并且sizeof(u)
是 2730025920,大约 2.5GB。
当我运行该程序时,出现错误Fortran runtime error: RECL parameter is non-positive in OPEN statement
,我认为这意味着记录大小太大。
有办法处理这个问题吗?一种选择是在多个写入调用中写入数组,以便每次写入的记录大小小于 2.5GB。但我想知道是否可以在一次调用中写入整个数组。
Edit:
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 上的 Opensuse 11.3
感谢您的帮助。
只要内存允许,您应该能够编写大数组。看起来你正在得到整数溢出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)
编辑:经过一番调查,这似乎是一个 gfortran 问题。为整数设置更高的种类reclen
解决了 ifort 和 pgf90 的问题,但没有解决 gfortran 的问题 - 我刚刚用版本 4.6.2 尝试过这个问题。虽然reclen
有正确的正值,看起来recl
是 gfortran 内部的 32 位有符号整数(感谢 @M.S.B. 指出了这一点)。 Fortran 运行时错误表明了这一点,而不是表明该值大于最大值。我怀疑这是操作系统问题。如果可能,尝试使用 ifort(免费用于非商业用途):英特尔非商业软件下载 http://software.intel.com/en-us/articles/non-commercial-software-download/.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)