Есть ли ограничение на количество открытых файлов в Windows? - PullRequest
41 голосов
/ 15 мая 2009

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

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

Ответы [ 7 ]

56 голосов
/ 15 мая 2009

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

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

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

12 голосов
/ 25 ноября 2010

Если вы используете стандартные библиотеки 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 в запуск сервера.

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

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

11 голосов
/ 18 июня 2009

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

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

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

7 голосов
/ 15 мая 2009

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

3 голосов
/ 16 мая 2009

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

0 голосов
/ 25 октября 2017

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

stdio.h:

/* Number of files that can be open simultaneously
*/
#if defined(__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
0 голосов
/ 15 мая 2009

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

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

В старом Д.О.С. ограничение было 255 одновременно открытых файлов.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...