【问题标题】:Opening multiple files in Fortran 90在 Fortran 90 中打开多个文件
【发布时间】:2011-11-28 12:12:24
【问题描述】:

我想打开 10,000 个文件名从 abc25000abc35000 的文件,并将一些信息复制到每个文件中。我写的代码如下:

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 运行时错误:打开的文件太多

我需要做什么来修复上面的代码?

【问题讨论】:

    标签: fortran fortran90


    【解决方案1】:

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

    我经常将运行 Fortran 程序的限制提高到 2048,但从不超过 10000。但是,我回应其他答案,如果可能,最好重组程序以在打开下一个文件之前关闭每个文件。

    【讨论】:

    • @Rook Regularly 可能有点夸张。它通常用于将卫星数据从每个图像一个文件转换为每个像素时间序列一个文件的一次性任务。这不是我引以为豪的代码。
    • 想多了;只有这句话的表达方式让我无法抗拒:)))
    • 我使用的是 linux ubuntu 10.10 64 位和内存 10GB。我有一点怀疑。如果我将 ulimit 提高到值 16348,会对操作系统产生负面影响吗?另一个问题是为什么专门要编号16348?我很想知道这一点。提前致谢。
    • 您的操作系统内核将施加硬限制,并且不允许您将此软限制提高到高于该限制:请参阅this question。默认值通常是 2 的幂,所以我只是坚持:16384=2^14。不过没必要。
    【解决方案2】:

    您需要一次处理一个文件(或分成不超过操作系统限制的小组)。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2013-10-29
        • 2018-03-01
        • 2020-08-07
        • 1970-01-01
        相关资源
        最近更新 更多