2009-10-05 6 views
5

Pracuję z dużymi matrycami, więc używam memmapy NumPy. Jednak otrzymuję błąd, ponieważ najwyraźniej deskryptory plików używane przez memmap nie są zamykane.NumPy i memmap: [Errno 24] Zbyt wiele otwartych plików

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) 

Z tego co wiem, plik memmap jest zamykany po wywołaniu metody close(). Jednakże powyższy kod nie może pętla zawsze, jak to w końcu rzuca „ERRNO [24] Zbyt wiele otwartych plików” Błąd:

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 

Czy ktoś wie co mam z widokiem?

Odpowiedz

4

Ponieważ memmap nie przyjmuje otwartego deskryptora pliku, ale nazwa pliku, prawdopodobnie wycieknie deskryptora pliku temp_fd. Czy pomoc jest dostępna pod numerem os.close(temp_fd)?


Wspaniale, że działa.

Ponieważ możesz przekazać numpy.memmap obiekt podobny do pliku, możesz go utworzyć z deskryptora pliku, który już masz, temp_fd.

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

Pomaga. Już działa. Dzięki. – plok