NumPy и memmap: [Errno 24] Слишком много открытых файлов - PullRequest
5 голосов
/ 05 октября 2009

Я работаю с большими матрицами, поэтому я использую карту памяти NumPy. Однако я получаю сообщение об ошибке, поскольку файловые дескрипторы, используемые memmap, по-видимому, не закрываются.

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] Too many open files »:

    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

Кто-нибудь знает, что я пропускаю?

1 Ответ

4 голосов
/ 05 октября 2009

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


Здорово, что это работает.

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

fobj = os.fdopen(temp_fd, "w+")
numpy.memmap(fobj, ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...