1

我正在尝试从 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

4

0 回答 0