2009-05-15 4 views
32

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

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

+0

Я полагаю, вы могли бы начать новый экземпляр себя (процесс) после 2048 файлов ... – Adam

+0

... или есть отдельный исполняемый файл, который делает ваши операции с файлами, который принимает местоположение Textfile как параметр r (каждая строка имеет операцию и местоположение файла) и работает, скажем, с 500 файлами за раз. – Adam

+0

Ресурсы всегда ограничены (независимо от компьютера и операционной системы). Так что, конечно, есть предел. Лучший вопрос - как запросить или увеличить этот предел. –

ответ

50

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

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

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

+0

Интересно. Этот лимит применяется к исполняемому файлу? Нить? Что-то другое? – Les

+7

Также: невозможно _setmaxstdio за пределами открытых открытых файлов, по крайней мере, с текущим Windows CRT. Если вам нужно больше открытых файлов, то вам придется использовать CreateFile (http://msdn.microsoft.com/en-us/library/aa363858.aspx) и связанные с ним функции Win32. Однако дизайн, который требует, чтобы многие открытые файлы, вероятно, были неправильными ... – ephemient

+0

Поскольку функция POSIX-ish _open() также является функцией CRT, это также относится к ее использованию, а также к функции stdio fopen(). –

7

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

+0

Правда, но есть ограничения и в S.O. –

0

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

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

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

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

+0

Это звучит как ограничение времени выполнения C, а не ОС. Я предполагаю, что если вы используете win32 api напрямую, вы можете открыть больше файлов. – CodesInChaos

3

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

+2

Иначе, если вы используете CRT, как указано OP. – Joe

10

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

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

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

10

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

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

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

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

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

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

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

-1

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

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 
Смежные вопросы