Estoy ejecutando un código que después de algunas horas, a veces minutos falla con el error
OSError: [Errno 24] Too many open filesY tengo verdaderos problemas para depurar esto. El error en sí siempre se desencadena por la línea marcada en el fragmento de código a continuación
try: with open(filename, 'rb') as f: contents = f.read() <----- error triggered here except OSError as e: print("e = ", e) raise else: # other stuff happensSin embargo, no veo ningún problema en esta parte del código (¿verdad?), así que supongo que otras partes del código no cierran los archivos correctamente. Sin embargo, aunque abro archivos bastante, siempre los abro con la declaración 'con', y entiendo que incluso si ocurre un error, los archivos se cerrarán (¿verdad?). Así que otra parte de mi código se ve así
try: with tarfile.open(filename + '.tar') as tar: tar.extractall(path=target_folder) except tarfile.ReadError as e: print("e = ", e) except OSError as e: print("e = ", e) else: # If everything worked, we are done returnEl código anterior se encuentra con un ReadError con bastante frecuencia, pero incluso si eso sucede, el archivo debe cerrarse, ¿verdad? Entonces, simplemente no entiendo cómo puedo encontrarme con demasiados archivos abiertos. Lo siento, esto no es reproducible para usted, ya que no puedo depurarlo lo suficiente, solo busco algunos consejos aquí, ya que estoy perdido. Cualquier ayuda es apreciada...
Editar: estoy en un macbook. Aquí está la salida de ulimit -a
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 256 pipe size (512 bytes, -p) 1 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1418 virtual memory (kbytes, -v) unlimitedSiguiendo la sugerencia de @ sj95126, cambié el código relacionado con el archivo tar a algo que asegura que el archivo esté cerrado
try: tar = tarfile.open(filename + '.tar') tar.extractall(path=target_folder) except tarfile.ReadError as e: print("tarfile.ReadError e = ", e) except OSError as e: print("e = ", e) else: # If everything worked, we are done return finally: print("close tar file") try: tar.close() except: print("file already closed")pero no resolvió el problema.
en los unix/linux hay un comando con el que puede verificar el número total de file locks o el límite open files usando ulimit -a . en la situación de @carl, el resultado fue:
core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited file size (blocks, -f) unlimited max locked memory (kbytes, -l) unlimited max memory size (kbytes, -m) unlimited open files (-n) 256 pipe size (512 bytes, -p) 1 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 1418 virtual memory (kbytes, -v) unlimited como puede ver, los open files o file locks son iguales a 256 :
open files (-n) 256 que es un valor muy small
El archivo de @carl contenía al menos más de 256 archivos; por lo que python estaba abriendo cada archivo usando un controlador de archivos, lo que luego da como resultado un system file lock (para abrir un archivo en un sistema necesita un bloqueo de archivos, como un puntero a ese archivo; para acceder a los datos, haga lo que quiera )
la solución es hacer que open files tengan un valor unlimited o very big .
de acuerdo con esta respuesta de pila , así es como puede cambiar el límite