Открытие нескольких файлов в Fortran 90 - PullRequest
3 голосов
/ 30 сентября 2011

Я хотел бы открыть 10000 файлов с именами файлов, начиная с abc25000 до 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

конец

Этот код должен генерировать файлы, начиная с abc24000 до abc35000, но останавливается примерно на полпути, говоря, что

В строке 17 файла test-openFile.f90 (unit = 26021, file = '')

Ошибка выполнения Fortran: слишком много открытых файлов

Что мне нужно сделать, чтобы исправить приведенный выше код?

Ответы [ 3 ]

5 голосов
/ 30 сентября 2011

Это ограничение установлено вашей ОС.Если вы используете вариант Unix / Linux, вы можете проверить ограничение с помощью командной строки, используя ulimit -n, и повысить его с помощью ulimit -n 16384.Вам нужно будет установить ограничение больше 10000, чтобы учесть все остальные файлы, которые будет открывать оболочка.Для этого вам также могут потребоваться права администратора.

Я регулярно увеличиваю ограничение до 2048 для запуска программ на Фортране, но не выше 10000. Однако я повторяю другие ответы, которые, если возможно, лучшереструктурировать вашу программу, чтобы закрыть каждый файл перед открытием следующего.

3 голосов
/ 30 сентября 2011

Вам нужно работать с файлами по одному (или небольшими группами, которые не превышают ограничения, налагаемые операционной системой).

for each file:
  open file
  write
  close file
3 голосов
/ 30 сентября 2011

Операционные системы, как правило, имеют ограничения на ресурсы. Как правило, в Linux, по умолчанию, существует ограничение в 1024 файловых дескриптора на процесс. Получаемое сообщение об ошибке - это просто библиотека времени исполнения Fortran, передающая информацию о том, что она не смогла открыть еще один файл из-за ошибки ОС.

...