IOError: Demasiados archivos abiertos:

Tengo un archivo enorme que estoy escribiendo en aproximadamente 450 archivos. Estoy recibiendo un error ya que too many files open . Busqué en la web y encontré alguna solución pero no me está ayudando.

 import resource resource.setrlimit(resource.RLIMIT_NOFILE, (1000,-1)) >>> len(pureResponseNames) #Filenames 434 >>> resource.getrlimit(resource.RLIMIT_NOFILE) (1000, 9223372036854775807) >>> output_files = [open(os.path.join(outpathDirTest, fname) + ".txt", "w") for fname in pureResponseNames] Traceback (most recent call last): File "", line 1, in  IOError: [Errno 24] Too many open files: 'icd9_737.txt' >>> 

También cambié ulimit desde la línea de comando como se muestra a continuación:

 $ ulimit -n 1200 $ 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) 1200 pipe size (512 bytes, -p) 1 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 709 virtual memory (kbytes, -v) unlimited $ 

Todavía estoy recibiendo el mismo error. PD: También reinicié mi sistema y ejecuté el progtwig pero sin éxito.

Los errores de “demasiados archivos abiertos” siempre son complicados: no solo tienes que jugar con ulimit, sino que también debes verificar los límites de todo el sistema y los específicos de OSX. Esta publicación SO proporciona más información sobre los archivos abiertos en OSX. (Alerta de spoiler: el valor predeterminado es 256).

Sin embargo, a menudo es fácil limitar la cantidad de archivos que deben estar abiertos al mismo tiempo. Si observamos el ejemplo de Stefan Bollman, podemos cambiarlo fácilmente a:

 pureResponseNames = ['f'+str(i) for i in range(434)] outpathDirTest="testCase/" output_files = [os.path.join(outpathDirTest, fname) + ".txt" for fname in pureResponseNames] for filename in range(output_files): with open(filename, 'w') as f: f.write('This is a test of file nr.'+str(i)) 

Debes probar $ ulimit -n 50000 en lugar de 1200

Puede considerar establecer en función de un límite máximo fijo en lugar de un límite ValueError codificado (lanzará ValueError si intenta establecer hard+1 ):

 import resource soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE) resource.setrlimit(resource.RLIMIT_NOFILE, (hard, hard)) 

Y quiero dejar en claro que no importa que elimines los archivos creados mientras la sesión de Python aún se está ejecutando, aún generará ese error.

Piense como es el número máximo de archivos creados (incluidos los eliminados) por sesión de python.

Un ejemplo de trabajo mínimo sería bueno. Obtuve los mismos resultados que ron.rothman utilizando el siguiente script con Python 3.3.2, GCC 4.2.1 en mac 10.6.8. ¿Obtiene errores al usarlo?

  import os, sys import resource resource.setrlimit(resource.RLIMIT_NOFILE, (1000,-1)) pureResponseNames = ['f'+str(i) for i in range(434)] try: os.mkdir("testCase") except: print('Maybe the folder is already there.') outpathDirTest="testCase/" output_files = [open(os.path.join(outpathDirTest, fname) + ".txt", "w") for fname in pureResponseNames] for i in range(len(output_files)): output_files[i].write('This is a test of file nr.'+str(i)) output_files[i].close()