Fortran 读取多个文件时内存分配错误
我正在尝试打开6个不同的文件(至少),然后读取每个文件中的行数,每个文件应该大约有20000行。我已经在这个论坛上读到了一些关于如何做到这一点的帖子,因为我是一个新手,我已经试着为我的目的实现它 我可以单独执行此操作,没有任何问题,但是当我尝试读取所有文件时,会收到一条错误消息。我收到“Killed:9”错误消息或malloc错误:Fortran 读取多个文件时内存分配错误,fortran,Fortran,我正在尝试打开6个不同的文件(至少),然后读取每个文件中的行数,每个文件应该大约有20000行。我已经在这个论坛上读到了一些关于如何做到这一点的帖子,因为我是一个新手,我已经试着为我的目的实现它 我可以单独执行此操作,没有任何问题,但是当我尝试读取所有文件时,会收到一条错误消息。我收到“Killed:9”错误消息或malloc错误: malloc: *** mach_vm_map(size=63032829050880) failed (error code=3) *** error: can'
malloc: *** mach_vm_map(size=63032829050880) failed (error code=3)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
关于内存分配,这个错误意味着什么?我做错了什么?我该如何着手纠正这个问题
PROGRAM X
IMPLICIT NONE
INTEGER :: J,IO,NFILES,NLINES
CHARACTER (LEN=128) :: FILENAME
NFILES = 6
NLINES = 0
DO J = 0,NFILES-1
WRITE(FILENAME,'(A,I7.7,A)') 'data_',J*200,'.txt'
OPEN(1,FILE='FILENAME',FORM='FORMATTED')
DO
READ(1,*,IOSTAT=IO)
IF (IO/=0) EXIT
NLINES = NLINES + 1
END DO
WRITE(*,*) NLINES
CLOSE(1)
END DO
END PROGRAM X
我正在使用gfortran进行编译
更新
我创建了6个测试文件,data_0000000.txt,data_0000200.txt,…,data_0001000.txt,每一个都少于10行,每行少于100个字符。不幸的是,我得到了同样的错误。强制性免责声明:如果您只想知道文件中的行数,请使用
wc-l
。如果没有必要,不要重新发明轮子
我写这篇文章不一定是因为我认为你不知道,而是因为其他人可能会来,并且认为他们需要编写自己的程序来获得文件的行数
至于你的问题:我不知道你为什么会出现malloc
错误。请告诉我们您使用的编译器和系统(包括版本)?也就是说,在阅读代码时,我注意到了三件事:
文件名
,但随后不使用它。您引用的是:FILE='FILENAME'
,这意味着open命令会查找字面上称为FILENAME
的文件,而不是名称存储在变量FILENAME
中的文件。删除引号:
OPEN(1, FILENAME=FILENAME, FORM='FORMATTED')
1
——这很危险。不同版本的Fortran使用特定的单元号进行特定用途。使用大得多的句柄(至少10个或更多),或者更好地在open语句中使用newunit
描述符:
INTEGER :: u
OPEN(NEWUNIT=u, FILE=FILENAME, ACTION='READ', FORM='FORMATTED')
READ(u, *, IOSTAT=IO)
CLOSE(u)
NLINES
变量重置为0。程序将直接打印每个文件的累计总和,而不是行数character(len=1000) :: dummy
...
READ(u, '(a)' , IOSTAT=IO) dummy
....
添加到@chw21的响应中,如果您的唯一目的是计算文件中的记录(行)数,那么这里有一个模块化解决方案和一个测试程序(计算在子例程
getNumRecordInFile()中完成)(
):
现在,如果将此代码放在名为“main.f95”的文件中,并在Fortran 2008标准下编译,那么它应该输出“main.f95”文件中的行数,如下所示:
$gfortran -std=f2008 *.f95 -o main
$main
Total number of records in file='main.f95': 98
对于测试,您只需将整个代码复制粘贴到在线Fortran编译器中即可:
但是请记住,在执行代码之前,通过转到
项目->编译选项,将编译选项-std=f95
更改为-std=f2008
。不,我不能。主要是因为我自己甚至不能重现malloc
错误。所以我所能做的就是检查代码中的各种问题,并告诉他去解决它。我本想把它作为一个评论,但它太长了。但你是对的,我没有解决具体的问题,我不应该提出其他要求。在花了大量时间试图重现错误并制定解决方案之后,我忘记了问题的细节。我的错。我改变了我的答案以反映这一点。谢谢。即使在我实现了您建议的更改之后,我仍然会遇到相同的错误。我正在尝试读取数百个输入文件中每一个文件的行数(为什么您在第#1点中给出的命令行条目不切实际),这样我就可以对读取的值进行一些计算。原则上有没有比我现在做的更好的方法?我真的卡住了!我使用<代码> gfortran < /COD>和FORTRAN 90,如果这很重要。您仍然可以考虑命令行条目作为简化解决方案的方法。像“wc-l data_*>linecounts”这样的命令将创建一个文件,其中包含与数据匹配的所有文件的所有行计数列表。然后,您可以打开一个文件来处理这些数字。您是否也按照建议将单元1更改为例如单元100。@albert是的,我将其更改为10(我也尝试了100)。您是否已经尝试使用边界检查进行编译,启用调试选项并使用gdb运行以查看它在何处抛出错误?请使用gfortran-g-O0-Wall-fcheck=all-fbacktrace编译@chw21谢谢!在我的完整代码中(不是我在这里发布的最小示例),我使用一些未初始化的变量分配内存。哦!对不起打扰大家了。现在一切正常。但是,您认为您可以解释这些编译器选项是什么吗?带有空参数列表的read
语句完全可以。它完全没有问题,只是跳过了文件中的一行。
$gfortran -std=f2008 *.f95 -o main
$main
Total number of records in file='main.f95': 98