5

我正在处理大型矩阵,所以我使用的是 NumPy 的 memmap。但是,我收到一个错误,因为 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)

据我了解,调用 close() 方法时会关闭 memmap 文件。但是,上面的代码不能永远循环,因为它最终会抛出“ [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

有人知道我在忽略什么吗?

4

1 回答 1

4

由于 memmap 不采用打开的文件描述符,而是采用文件名,我想您泄漏了temp_fd文件描述符。有os.close(temp_fd)帮助吗?


太好了,它的工作原理。

由于您可以传递 numpy.memmap 一个类似文件的对象,因此您可以从已有的文件描述符创建一个,temp_fd.

fobj = os.fdopen(temp_fd, "w+")
numpy.memmap(fobj, ...
于 2009-10-05T13:42:54.137 回答