NumPy和memmap:[Errno 24] 打开的文件太多。

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

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

1个回答

5

由于memmap不使用打开的文件描述符,而是使用文件名,我猜测你泄漏了temp_fd文件描述符。是否os.close(temp_fd)有帮助?


太棒了,它起作用了。

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接