2009-10-05 3 views
5

Я работаю с большими матрицами, поэтому я использую memmap NumPy. Тем не менее, я получаю сообщение об ошибке, поскольку, по-видимому, дескрипторы файлов, используемые memmap, не закрываются.NumPy и memmap: [Errno 24] Слишком много открытых файлов

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) 

Из того, что я понимаю, файл memmap закрывается при вызове метода close(). Тем не менее, приведенный выше код может не бесконечный цикл, так как он в конце концов бросает «[Errno 24] Слишком много открытых файлов» ошибок:

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 

Кто-нибудь знает, что я с видом?

ответ

4

Поскольку memmap не принимает дескриптор открытого файла, но имя файла, я полагаю, вы пропустили дескриптор файла temp_fd. Помогает ли os.close(temp_fd)?


Отлично, что он работает.

Поскольку вы можете передать numpy.memmap файлоподобный объект, вы можете создать его из уже существующего дескриптора файла, temp_fd.

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

Это помогает. Теперь работает. Благодарю. – plok

Смежные вопросы