4

abc25000までのファイル名で10,000個のファイルを開きabc35000、各ファイルにいくつかの情報をコピーしたいと思います。私が書いたコードは以下の通りです:

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ランタイムエラー:開いているファイルが多すぎます

上記のコードを修正するにはどうすればよいですか?

4

3 に答える 3

6

この制限はOSによって設定されます。Unix / Linuxバリアントを使用している場合は、を使用してコマンドラインから制限を確認し、を使用して制限をulimit -n引き上げることができulimit -n 16384ます。シェルが開く他のすべてのファイルを許可するには、10000を超える制限を設定する必要があります。これを行うには、管理者権限も必要になる場合があります。

私は定期的に制限を2048まで上げて、Fortranプログラムを実行しますが、10000まで上げることはありません。ただし、可能であれば、次のファイルを開く前に各ファイルを閉じるようにプログラムを再構築することをお勧めします。

于 2011-09-30T15:23:07.187 に答える
3

オペレーティングシステムには、リソースに制限がある傾向があります。通常、たとえばLinuxでは、デフォルトでプロセスごとに1024個のファイル記述子の制限があります。表示されるエラーメッセージは、OSエラーのためにさらに別のファイルを開くことができなかったという情報を上向きに渡すFortranランタイムライブラリです。

于 2011-09-30T14:11:06.473 に答える
3

一度に1つずつ(またはオペレーティングシステムによって課せられた制限を超えない小さなグループで)ファイルを操作する必要があります。

ファイルごとに:
  ファイルを開く
  書きます
  ファイルを閉じる
于 2011-09-30T14:16:28.707 に答える