2009-05-15 36 views
32

Estoy abriendo muchos archivos con fopen() en VC++ pero después de un tiempo falla.Existe un límite en el número de archivos abiertos en Windows

¿Existe un límite en la cantidad de archivos que puede abrir simultáneamente?

+0

supongo que podría iniciar una nueva instancia de sí mismo (el proceso) después de 2048 archivos ... – Adam

+0

... o tener un ejecutable independiente que realiza sus operaciones de archivo que tiene una ubicación de archivo de texto como un parámetro r (cada línea tiene una ubicación de operación y archivo) y funciona con, digamos, 500 archivos a la vez. – Adam

+0

Los recursos son siempre limitados (independientemente de la computadora y el sistema operativo). Entonces, por supuesto, hay un límite. La mejor pregunta es cómo consultar o aumentar ese límite. –

Respuesta

50

Las bibliotecas en tiempo de ejecución de C tienen un límite de 512 para la cantidad de archivos que se pueden abrir al mismo tiempo. Intentar abrir más que el número máximo de descriptores de archivos o secuencias de archivos provoca un error en el programa. Use _setmaxstdio para cambiar este número. Se puede leer más información sobre esto here

También es posible que deba comprobar si su versión de Windows admite el límite superior que está intentando establecer con _setmaxstdio. Para obtener más información sobre _setmaxstdio cheque here

información sobre el tema correspondiente a VS 2015 se puede encontrar here

+0

Interesante. ¿Este límite se aplica al ejecutable? ¿Hilo? ¿Algo más? – Les

+7

Además: No es posible _setmaxstdio más allá de 2048 archivos abiertos, al menos con el actual CRT de Windows. Si necesita más archivos abiertos que eso, tendrá que usar CreateFile (http://msdn.microsoft.com/en-us/library/aa363858.aspx) y funciones de Win32 relacionadas. Sin embargo, un diseño que requiera muchos archivos abiertos probablemente sea incorrecto ... – ephemient

+0

Dado que la función POSIX-ish _open() también es una función CRT, esto también se aplica al uso de esa función así como a la función stdio fopen(). –

7

Sí, hay límites según el nivel de acceso que utilice al abrir los archivos. Puede usar _getmaxstdio para encontrar los límites y _setmaxstdio para cambiar los límites.

+0

Es verdad, pero también hay límites en el S.O. –

0

Sí, hay un límite.

El límite depende del sistema operativo y la memoria disponible.

En el antiguo D.O.S. el límite fue de 255 archivos abiertos simultáneamente.

En Windows XP, el límite es más alto (creo que es 2,048 según lo indicado por MSDN).

+0

Esto suena como una limitación del tiempo de ejecución C, y no del sistema operativo. Supongo que si usas la API de Win32 directamente puedes abrir más archivos. – CodesInChaos

3

No sé dónde estará Paulo tiene ese número desde .. En sistemas operativos de Windows NT el número de archivo los mangos abiertos por proceso están básicamente limitados por la memoria física; sin duda está en cientos de miles.

+2

Es diferente si está utilizando el CRT, como lo establece el OP. – Joe

10

En caso de que alguien más no sepa a qué se aplica el límite, creo que este es un límite por proceso y no para todo el sistema.

Acabo de escribir un pequeño programa de prueba para abrir archivos hasta que falla. Llega a 2045 archivos antes de fallar (2045 + STDIN + STDOUT + STDERROR = 2048), luego lo dejé abierto y ejecuté otra copia.

La segunda copia mostró el mismo comportamiento, lo que significa que tenía al menos 4096 archivos abiertos a la vez.

10

Si usa las bibliotecas estándar C/C++ POSIX con Windows, la respuesta es "sí", hay un límite.

Sin embargo, curiosamente, el límite lo impone el tipo de bibliotecas C/C++ que está utilizando.

Me encontré con el siguiente hilo JIRA (http://bugs.mysql.com/bug.php?id=24509) de MySQL. Estaban lidiando con el mismo problema sobre la cantidad de archivos abiertos.

Sin embargo, Paul Dubois explicó que el problema de manera efectiva podría ser eliminado en Windows mediante el uso de ...

Win32 llamadas a la API (CreateFile(), WriteFile(), y así sucesivamente) y el valor por defecto la cantidad máxima de archivos abiertos se ha aumentado a 16384.El máximo de se puede aumentar aún más por usando la opción --max-open-files = N en el inicio del servidor .

Naturalmente, podría tener una cantidad teóricamente grande de archivos abiertos mediante el uso de una técnica similar a la agrupación de conexiones de bases de datos, pero eso tendría un grave efecto en el rendimiento.

De hecho, abrir una gran cantidad de archivos podría ser un mal diseño. Sin embargo, algunas situaciones lo requieren. Por ejemplo, si está creando un servidor de base de datos que usarán miles de usuarios o aplicaciones, el servidor necesariamente tendrá que abrir una gran cantidad de archivos (o sufrir un golpe de rendimiento al usar las técnicas de agrupación de descriptores de archivos).

-1

Encontré el mismo problema, pero usando Embarcadero C++ - Creador de RAD Studio 10.2. El C-tiempo de ejecución de esa cosa no parece proporcionar _getmaxstdio o _setmaxstdio, pero algunos macros y su límite por defecto es mucho menor que lo que se dice aquí para otros tiempos de ejecución:

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 
Cuestiones relacionadas