2009-10-05 3 views
5

Sto lavorando con grandi matrici, quindi sto usando la memmap di NumPy. Tuttavia, sto ricevendo un errore in quanto apparentemente i descrittori di file usati da memmap non vengono chiusi.NumPy e memmap: [Errno 24] Troppi file aperti

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) 

Da quello che ho capito, il file memmap viene chiuso quando viene chiamato il metodo close(). Tuttavia, il codice di cui sopra non può ciclo per sempre, in quanto alla fine getta il "[24] Errno Troppi file aperti" errore:

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 

Qualcuno sa quello che sto sottovalutando?

risposta

4

Poiché la memmap non accetta il descrittore di file aperto, ma il nome del file, suppongo che si verifichi la perdita del descrittore di file temp_fd. os.close(temp_fd) aiuta?


Grande che funziona.

Poiché è possibile passare a numpy.memmap un oggetto simile a un file, è possibile crearne uno dal descrittore di file che si possiede già, temp_fd.

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

Aiuta. Sta lavorando adesso. Grazie. – plok