Есть ли ограничение на количество открытых файлов в Windows?

Есть ли ограничение на количество открытых файлов в Windows?
На чтение
11 мин.
Просмотров
22
Дата обновления
11.11.2024

Я открываю много файлов с помощью fopen () в VC ++, но через некоторое время она перестает работать.

Есть ли ограничение на количество файлов, которые вы можете открывать одновременно?


Библиотеки времени выполнения C имеют ограничение в 512 для количества файлов, которые могут быть открыты одновременно. Попытка открыть больше, чем максимальное количество файловых дескрипторов или файловых потоков приводит к сбою программы. Используйте _setmaxstdio , чтобы изменить это число. Более подробную информацию об этом можно прочитать здесь.

Также вам может потребоваться проверить, поддерживает ли ваша версия Windows верхний предел, который вы пытаетесь установить с помощью _setmaxstdio . Для получения дополнительной информации о _setmaxstdio проверьте здесь

Информацию по теме, соответствующей VS 2015, можно найти здесь


Если кто-то еще не понимает, к чему применяется ограничение, я считаю, что это ограничение для каждого процесса, а не для всей системы.

Я просто написал небольшую тестовую программу, чтобы открывать файлы до тех пор, пока она не выйдет из строя. До сбоя он достигает 2045 файлов (2045 + STDIN + STDOUT + STDERROR = 2048), затем я оставил его открытым и запустил еще одну копию.

Вторая копия показала такое же поведение, то есть у меня было на одновременно открывается не менее 4096 файлов.


Если вы используете стандартный C /C ++ POSIX библиотеки с Windows, ответ «да», есть предел.

Однако, что интересно, ограничение налагается типом библиотек C/C ++, которые вы используете.

Я наткнулся на следующую ветку JIRA (http://bugs.mysql.com/bug.php?id=24509) из MySQL. Они столкнулись с той же проблемой, связанной с количеством открытых файлов.

Однако Пол Дюбуа объяснил, что проблему можно эффективно устранить в Windows, используя …

Вызовы Win32 API (CreateFile (), WriteFile () и т. д.), а максимальное количество открытых файлов по умолчанию было увеличено до 16384. Максимальное количество может быть увеличено с помощью параметра —max-open -files = N параметр при запуске сервера.

Естественно, вы можете иметь теоретически большое количество открытых файлов, используя технику, аналогичную объединению соединений с базой данных, но при этом серьезно сказывается на производительности.

Действительно, открытие большого количества файлов может быть плохим дизайном. Однако в некоторых ситуациях это необходимо. Например, если вы создаете сервер базы данных, который будет использоваться тысячами пользователей или приложений, серверу обязательно придется открывать большое количество файлов (или снижать производительность при использовании методов объединения файловых дескрипторов).


Да, есть ограничения в зависимости от уровень доступа, который вы используете при открытии файлов. Вы можете использовать _getmaxstdio , чтобы найти ограничения, и _setmaxstdio , чтобы изменить ограничения.

1


Я не знаю, откуда Пауло взял это число. В операционных системах на базе Windows NT количество дескрипторов файлов, открытых для каждого процесса, в основном ограничено физической памятью — определенно исчисляется сотнями тысяч.

1


Возникла та же проблема, но с использованием Embarcadero C ++ — Builder RAD Studio 10.2. Среда выполнения C этой штуки, похоже, не предоставляет _getmaxstdio или _setmaxstdio , но некоторые макросы и их предел по умолчанию намного ниже, чем здесь сказано для других сред выполнения:

stdio.h:

 /* Количество файлов, которые могут быть открыты одновременно */# если определено (__ STDC __) #  define FOPEN_MAX (_NFILE _) # else # define FOPEN_MAX (_NFILE _) #define SYS_OPEN (_NFILE _) # endif  

_nfile.h:

  #if defined (_WIN64) #define _NFILE_ 512 # else # define _NFILE_ 50 # endif  

1


Да, ограничение есть.

Ограничение зависит от ОС и доступной памяти.

В старый DOS ограничение составляло 255 одновременно открытых файлов.

В Windows XP предел выше (я считаю, что это 2048, как указано в MSDN).

1



0 Комментариев
Комментариев на модерации: 0
Оставьте комментарий