NumPy和memmap: [Errno 24] 打开文件过多

5 投票
1 回答
3201 浏览
提问于 2025-04-15 14:49

我正在处理很大的矩阵,所以我在用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] 打开的文件太多"的错误:

    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, ...

撰写回答