plo*_*lok 5 python memory-management numpy
我正在使用大矩阵,所以我使用的是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)
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当调用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
Run Code Online (Sandbox Code Playgroud)
有人知道我在俯瞰什么吗?
由于 memmap 不采用打开的文件描述符,而是采用文件名,因此我认为您泄漏了文件描述符temp_fd
。有os.close(temp_fd)
帮助吗?
太棒了,它有效。
由于您可以向 numpy.memmap 传递一个类似文件的对象,因此您可以从已有的文件描述符 中创建一个temp_fd
。
fobj = os.fdopen(temp_fd, "w+")
numpy.memmap(fobj, ...
Run Code Online (Sandbox Code Playgroud)