我正在尝试从 FORTRAN 程序中的一个非常大的文本文件中读取数据。该程序在使用英特尔 Fortran 编译器编译时工作正常,但在使用 gfortran 编译时会出现段错误。
数据文件被格式化为每行通常有六个单曲。但是每 ~ 10k 行就有一行少于六个值。例如:
0.1466E+01 0.1459E+01 0.1203E+01 0.1362E+01 0.1281E+01 0.1544E+01
0.1480E+01 0.1517E+01 0.1238E+01 0.1056E+01 0.1204E+01 0.1269E+01
:
0.3555E+00 0.3253E+00 0.6127E+00 0.6702E+00 0.1848E+01 0.2122E+01
0.2039E+01 0.6350E+00 0.6725E+00
我在 FORTRAN 中编写了一个程序来读取这个文件。最小版本如下所示:
PROGRAM bigdataread
REAL,ALLOCATABLE :: VAR(:)
INTEGER :: NP, NVAR, NPER
CHARACTER(len=80) :: MOPFILE
MOPFILE = 'bigdata.OUT'
NP = 9945 ! Number of grid points
NVAR = 7 ! Number of Variables
NPER = 2920 ! Number of times-steps
ALLOCATE(VAR(NP*NVAR*NPER))
WRITE(LUNCO,*)'Alocated size ',SIZE(VAR)
OPEN(UNIT=8,FILE=MOPFILE)
READ(8,*,END=104,ERR=101)VAR
WRITE(*,*)'Bigdata sucsessfully read'
STOP
104 WRITE(*,*)'Reached end of file'
101 WRITE(*,*)'Problem reading in the .OUT file'
STOP
END
如果 'NPER' 大于 1300,则程序(使用 gfortran 编译时)将出现段错误。我已使用“$ wc bigdata.OUT”确认数据文件具有正确数量的值。鉴于对可变大小的依赖,这似乎是一个内存问题,但我不知道如何。我的理解是 gfortan 默认将数组放在堆上而不是堆栈上。有人知道这里发生了什么吗?也许您对进一步调试此问题有一些有用的建议?
以下是我的平台的详细信息:
gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
ifort 版本 12.1.3
处理器:12x Intel(R) Core(TM) i7-3930K CPU @ 3.20GHz
内存:16412MB(已使用 8865MB)
操作系统:Linux Mint 13 Maya