web-dev-qa-db-fra.com

Le nombre de fichiers ouverts dans Windows est-il limité?

J'ouvre beaucoup de fichiers avec fopen () dans VC++, mais après un certain temps, cela échoue.

Y a-t-il une limite au nombre de fichiers que vous pouvez ouvrir simultanément?

39
Jimmy J

Les bibliothèques d'exécution C ont une limite de 512 pour le nombre de fichiers pouvant être ouverts à la fois. Tenter d'ouvrir plus que le nombre maximal de descripteurs de fichier ou de flux de fichiers entraîne l'échec du programme. Utilisez _setmaxstdio pour changer ce numéro. Plus d'informations à ce sujet peuvent être lues ici

Vous devrez peut-être également vérifier si votre version de Windows prend en charge la limite supérieure que vous essayez de définir avec _setmaxstdio. Pour plus d’informations sur _setmaxstdio, consultez ici

Vous trouverez des informations sur le sujet correspondant à VS 2015 ici

54
stack programmer

Si vous utilisez les bibliothèques standard C/C++ POSIX avec Windows, la réponse est "oui", il y a une limite.

Cependant, il est intéressant de noter que la limite est imposée par le type de bibliothèques C/C++ que vous utilisez.

Je suis tombé sur le fil JIRA suivant ( http://bugs.mysql.com/bug.php?id=24509 ) de MySQL. Ils avaient le même problème concernant le nombre de fichiers ouverts.

Cependant, Paul DuBois a expliqué que le problème pouvait effectivement être éliminé sous Windows en utilisant ...

Appels de l'API Win32 (CreateFile (), WriteFile (), etc.) et le nombre maximum de fichiers ouverts par défaut a été augmenté à 16384. Le maximum peut être encore augmenté de en utilisant l'option --max-open-files = N à démarrage du serveur.

Naturellement, vous pourriez avoir un nombre théoriquement important de fichiers ouverts en utilisant une technique similaire à la mise en pool des connexions de base de données, mais cela aurait un effet considérable sur les performances.

En effet, ouvrir un grand nombre de fichiers peut être une mauvaise conception. Cependant, certaines situations appellent le requièrent. Par exemple, si vous construisez un serveur de base de données qui sera utilisé par des milliers d'utilisateurs ou d'applications, le serveur devra nécessairement ouvrir un grand nombre de fichiers (ou subir une perte de performances en utilisant des techniques de mise en pool de descripteurs de fichiers).

12
luiscolorado

Si quelqu'un d'autre ne sait pas exactement à quoi la limite s'applique, je pense qu'il s'agit d'une limite par processus et non pas à l'échelle du système.

Je viens d'écrire un petit programme de test pour ouvrir des fichiers jusqu'à ce qu'il échoue. Il arrive à 2045 fichiers avant d'échouer (2045 + STDIN + STDOUT + STDERROR = 2048), puis j'ai laissé celui-ci ouvert et j'ai exécuté une autre copie.

La deuxième copie présentait le même comportement, ce qui signifie que j'avais au moins 4096 fichiers ouverts en même temps.

11
Drarok

Oui, il existe des limites en fonction du niveau d'accès utilisé lors de l'ouverture des fichiers. Vous pouvez utiliser _getmaxstdio pour rechercher les limites et _setmaxstdio pour les modifier.

7
Malcolm Post

Je ne sais pas d'où Paulo tire ce chiffre. Dans les systèmes d'exploitation Windows NT, le nombre de descripteurs de fichiers ouverts par processus est essentiellement limité par la mémoire physique - il est certainement en centaines de milliers.

3
Larry Osterman

Oui, il y a une limite.

La limite dépend du système d'exploitation et de la mémoire disponible.

Dans l'ancien D.O.S. la limite était de 255 fichiers ouverts simultanément.

Dans Windows XP, la limite est supérieure (je crois que 2 048 comme indiqué par MSDN ).

0
Paulo Santos

Nous avons rencontré le même problème, mais en utilisant Embarcadero C++ - Builder de RAD Studio 10.2. Le runtime C de cette chose ne semble pas fournir _getmaxstdio ou _setmaxstdio, mais certaines macros et leur limite par défaut sont bien inférieures à ce qui est dit ici pour d'autres runtimes:

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
Thorsten Schöning