Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.145.59.165] |
|
Сообщ.
#1
,
|
|
|
Открытие файла (open (...)) образует 2 или 3 дескриптора, закрытие (close(...)) удаляет только один.
Функция GETFILEINFOQQ (...), кстати, тоже добавляет один дескриптор, который остаётся висеть в процессе. Таким образом, если идёт интенсивная работа с файлами, то дескрипторы (особенно open/close), то количество дескрипторов лавинообразно растёт (до сотен тысяч), и это быстро приводит к нехватке ресурсов. Кто-нибуди сталкивался с такой проблемой? Можно ли принудительно закрывать неиспользуемые дескрипторы? |
Сообщ.
#2
,
|
|
|
Какой компилятор?
|
Сообщ.
#3
,
|
|
|
Цитата ValterG @ Какой компилятор? Intel Visual Fortran Compiler 11.1.038 |
Сообщ.
#4
,
|
|
|
На такие проблемы в фортране как-то не обращал внимание. В основном делал расчеты, а там - открыть пару десятков файлов, рассчитать и закрыть. Т.е. максимум до 200 дескрипторов. Это не критично нынче. А если такая проблема, то используй Win API.
|
Сообщ.
#5
,
|
|
|
Спасибо, NetVir.
Проблему с GETFILEINFOQQ решили: её надо вызывать два раза, второй - с хэндлом, полученным после первого прохождения, при этом открытый дескриптор закрывается. Как выяснилось, именно эта функция, вызываемая тысячи раз, приводила к росту дескрипторов. Накопление дескрипторов после open/close не очень существенно: вцелом, при большом количестве этих операций они не растут лавинообразно, вероятно, с течением времени неиспользующиеся дескрипторы ОС закрывает сама. |
Сообщ.
#6
,
|
|
|
по идее close должен освобождать дескриптор, связанный с указанным ему каналом. По идее то же делает open если ему передан уже открытый канал. Видимо действительно, какая-то внутренняя оптимизация, с задержанным закрытием файлов.
Возможно GETFILEINFOQQ имеет какой-то механизм освобождения дескрипторов, или получается, что разработчики пропустили утечку, которая даже простыми тестами выявляется. Возможно тут как с FindFirst, FindNext, FindClose. В однозадачной DOS на FAT12-, FAT16-разделах последняя функция была не нужна, вся информация хранилась в поисковой структуре. А в Windows вся информацию в эту структуру уже не помещается - пришлось создавать дескриптор и понадобилось его закрывать. |