在Fortran 90中打开多个文件

4

我想打开以abc25000开始,直到abc35000的文件中的10,000个文件,并将一些信息复制到每个文件中。 我编写的代码如下:

PROGRAM puppy
IMPLICIT NONE

integer :: i
CHARACTER(len=3) :: n1
CHARACTER(len=5) :: cnum
CHARACTER(len=8) :: n2

loop1: do i = 25000 ,35000  !in one frame

  n1='abc'
  write(cnum,'(i5)') i
  n2=n1//cnum
  print*, n2
  open(unit=i ,file=n2)

enddo loop1

结束

这段代码应该生成从abc24000abc35000的文件,但是它只能完成一半就会出现以下错误:

在文件test-openFile.f90的第17行(单位=26021,文件='')

Fortran运行时错误:打开文件太多

我需要怎么做才能修复上述代码?

3个回答

6

此限制由您的操作系统设定。如果您使用的是Unix / Linux变体,可以使用命令行使用ulimit -n检查限制,并使用ulimit -n 16384提高它。您需要设置一个大于10000的限制以允许Shell打开的所有其他文件。您可能还需要管理员权限才能执行此操作。

我经常将限制提高到2048以运行Fortran程序,但从未达到10000这么高。然而,我赞同其他答案,如果可能的话,最好重新构建程序,在打开下一个文件之前关闭每个文件。


@Rook 说经常可能有点夸张。通常只是用于将卫星数据从每个图像一个文件转换为每个像素时间序列一个文件的一次性任务。这不是我引以为豪的代码。 - Deditos
想到了,只是那句话用的方式让我无法抗拒 :))) - Rook
我正在使用的是Linux Ubuntu 10.10 64位和10GB内存。我有一个小疑问。如果我将ulimit提高到16348,操作系统会有任何负面影响吗?另一个问题是为什么要使用特定的数字16348?我很想知道这个答案。提前感谢您。 - Vijay
你的操作系统内核将会强制执行硬限制,不允许你将软限制提高到超过它:请参考这个问题。默认值通常是2的幂次方,所以我只是遵循了这个规则:16384=2^14。但这并非必须如此。 - Deditos

3

操作系统通常对资源有限制。例如,在Linux上,默认情况下,每个进程有1024个文件描述符的限制。您收到的错误消息只是Fortran运行时库向上传递信息,说明由于操作系统错误,无法打开另一个文件。


3

您需要逐个处理文件(或按照操作系统的限制进行小组处理)。

对于每个文件:
  打开文件
  写入内容
  关闭文件

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接