我正在尝试将数组写入文件,我以这种方式打开文件:
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(免费用于非商业用途):英特尔非商业软件下载.
| 归档时间: |
|
| 查看次数: |
6711 次 |
| 最近记录: |