2009-10-05 15 views
5

Estoy trabajando con matrices grandes, entonces estoy usando el memmap de NumPy. Sin embargo, recibo un error ya que aparentemente los descriptores de archivos utilizados por memmap no se están cerrando.NumPy y memmap: [Errno 24] Demasiados archivos abiertos

import numpy 
import tempfile 

counter = 0 
while True: 
    temp_fd, temporary_filename = tempfile.mkstemp(suffix='.memmap') 
    map = numpy.memmap(temporary_filename, dtype=float, mode="w+", shape=1000) 
    counter += 1 
    print counter 
    map.close() 
    os.remove(temporary_filename) 

Por lo que entiendo, el archivo memmap se cierra cuando se llama al método close(). Sin embargo, el código anterior no puede bucle infinito, ya que finalmente lanza el "[24] Errno Demasiados archivos abiertos" error:

1016 
    1017 
    1018 
    1019 
    Traceback (most recent call last): 
     File "./memmap_loop.py", line 11, in <module> 
     File "/usr/lib/python2.5/site-packages/numpy/core/memmap.py", line 226, in __new__ 
    EnvironmentError: [Errno 24] Too many open files 
    Error in sys.excepthook: 
    Traceback (most recent call last): 
     File "/usr/lib/python2.5/site-packages/apport_python_hook.py", line 38, in apport_excepthook 
    ImportError: No module named packaging_impl 

    Original exception was: 
    Traceback (most recent call last): 
     File "./memmap_loop.py", line 11, in <module> 
     File "/usr/lib/python2.5/site-packages/numpy/core/memmap.py", line 226, in __new__ 
    EnvironmentError: [Errno 24] Too many open files 

¿Alguien sabe lo que estoy pasando por alto?

Respuesta

4

Dado que el memmap no toma el descriptor de archivo abierto, pero el nombre del archivo, supongo que se pierde el descriptor de archivo temp_fd. ¿Ayuda os.close(temp_fd)?


Genial que funcione.

Dado que puede pasar numpy.memmap a un objeto similar a un archivo, puede crear uno a partir del descriptor de archivo que ya tiene, temp_fd.

fobj = os.fdopen(temp_fd, "w+") 
numpy.memmap(fobj, ... 
+0

Ayuda. Está funcionando ahora. Gracias. – plok

Cuestiones relacionadas