Подтвердить что ты не робот

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

Я открываю много файлов с fopen() в VС++, но через некоторое время он терпит неудачу.

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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

Ответ 3

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

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

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

Однако Paul DuBois объяснил, что проблему можно эффективно устранить в Windows, используя...

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

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

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

Ответ 4

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

Ответ 5

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

Ответ 6

Да, есть предел.

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

В старой D.O.S. предел был 255 одновременно открытыми файлами.

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

Ответ 7

Произошла одна и та же проблема, но с использованием Embarcadero С++ - 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