Я открываю много файлов с fopen() в VC++, но через некоторое время он терпит неудачу.Есть ли ограничение на количество открытых файлов в Windows
У вас есть ограничение на количество файлов, которое вы можете открыть одновременно?
Я открываю много файлов с fopen() в VC++, но через некоторое время он терпит неудачу.Есть ли ограничение на количество открытых файлов в Windows
У вас есть ограничение на количество файлов, которое вы можете открыть одновременно?
Библиотеки времени выполнения C имеют ограничение 512 для количества файлов, которые могут быть открыты в любой момент времени. Попытка открыть больше, чем максимальное количество файловых дескрипторов или файловых потоков, приводит к сбою программы. Используйте _setmaxstdio
, чтобы изменить этот номер. Более подробную информацию об этом можно прочитать. here
Также вам может потребоваться проверить, поддерживает ли ваша версия Windows верхний предел, который вы пытаетесь установить с помощью _setmaxstdio
. Для получения дополнительной информации о _setmaxstdio
проверке here
Информации по этому вопросу, соответствующая VS 2015 можно найти here
Интересно. Этот лимит применяется к исполняемому файлу? Нить? Что-то другое? – Les
Также: невозможно _setmaxstdio за пределами открытых открытых файлов, по крайней мере, с текущим Windows CRT. Если вам нужно больше открытых файлов, то вам придется использовать CreateFile (http://msdn.microsoft.com/en-us/library/aa363858.aspx) и связанные с ним функции Win32. Однако дизайн, который требует, чтобы многие открытые файлы, вероятно, были неправильными ... – ephemient
Поскольку функция POSIX-ish _open() также является функцией CRT, это также относится к ее использованию, а также к функции stdio fopen(). –
Да, существуют ограничения, зависящие от уровня доступа, который вы используете при открытии файлов. Вы можете использовать _getmaxstdio
, чтобы найти лимиты и _setmaxstdio
, чтобы изменить ограничения.
Правда, но есть ограничения и в S.O. –
Да, есть предел.
Предел зависит от ОС и доступной памяти.
В старой D.O.S. предел был 255 одновременно открытыми файлами.
В Windows XP предел выше (я считаю, что это 2048, как указано MSDN).
Это звучит как ограничение времени выполнения C, а не ОС. Я предполагаю, что если вы используете win32 api напрямую, вы можете открыть больше файлов. – CodesInChaos
Я не знаю, где Пауло получил этот номер из .. В Windows NT на базе операционных систем количество файлов Ручки, открытые для каждого процесса, в основном ограничены физической памятью - это, безусловно, в сотнях тысяч.
Иначе, если вы используете CRT, как указано OP. – Joe
В случае, если кто-либо еще неясен в отношении того, к чему применяется предел, я считаю, что это предел для каждого процесса, а не общесистемный.
Я только что написал небольшую тестовую программу для открытия файлов, пока не сработает. Он получает до 2045 файлов перед сбоем (2045 + STDIN + STDOUT + STDERROR = 2048), затем я оставил это открытым и выполнил другую копию.
Вторая копия показала то же поведение, то есть сразу открылось как минимум 4096 файлов.
Если вы используете стандартные библиотеки 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 при запуске сервера .
Естественно, вы могли бы иметь теоретически большое количество открытых файлов, используя технику, похожую на объединение соединений с базами данных, но это оказало бы серьезное влияние на производительность.
Действительно, открытие большого количества файлов может быть плохим дизайном. Однако некоторые ситуации требуют этого. Например, если вы создаете сервер базы данных, который будет использоваться тысячами пользователей или приложений, серверу обязательно придется открыть большое количество файлов (или пострадать от удара по производительности, используя методы объединения файлов и дескрипторов).
Похожая по одной и той же проблеме, но с использованием 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
Я полагаю, вы могли бы начать новый экземпляр себя (процесс) после 2048 файлов ... – Adam
... или есть отдельный исполняемый файл, который делает ваши операции с файлами, который принимает местоположение Textfile как параметр r (каждая строка имеет операцию и местоположение файла) и работает, скажем, с 500 файлами за раз. – Adam
Ресурсы всегда ограничены (независимо от компьютера и операционной системы). Так что, конечно, есть предел. Лучший вопрос - как запросить или увеличить этот предел. –