Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 读取多个文件时内存分配错误_Fortran - Fatal编程技术网

Fortran 读取多个文件时内存分配错误

Fortran 读取多个文件时内存分配错误,fortran,Fortran,我正在尝试打开6个不同的文件(至少),然后读取每个文件中的行数,每个文件应该大约有20000行。我已经在这个论坛上读到了一些关于如何做到这一点的帖子,因为我是一个新手,我已经试着为我的目的实现它 我可以单独执行此操作,没有任何问题,但是当我尝试读取所有文件时,会收到一条错误消息。我收到“Killed:9”错误消息或malloc错误: malloc: *** mach_vm_map(size=63032829050880) failed (error code=3) *** error: can'

我正在尝试打开6个不同的文件(至少),然后读取每个文件中的行数,每个文件应该大约有20000行。我已经在这个论坛上读到了一些关于如何做到这一点的帖子,因为我是一个新手,我已经试着为我的目的实现它

我可以单独执行此操作,没有任何问题,但是当我尝试读取所有文件时,会收到一条错误消息。我收到“Killed:9”错误消息或malloc错误:

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