考虑两个简单的脚本:
# memtest.py
import numpy as np
import pylab as plt
import os
import time
def check_mem(msg):
print msg + os.popen('free -m').readlines()[2].split()[2] + " MB"
arr = np.zeros(5000000)
check_mem("before plot: ")
plt.plot(arr) # ~100 mb
check_mem("after plot: ")
plt.show()
time.sleep(5)
check_mem("after closing the fig: ")
和
# memtest_short.py
import numpy as np
import pylab as plt
import os
def check_mem(msg):
print msg + os.popen('free -m').readlines()[2].split()[2] + " MB"
arr = np.zeros(5000000)
正在运行memtest.py
:
$ python2 -i mem_test.py
before plot: 1809 MB
after plot: 1926 MB
after closing the fig: 1815 MB
表示垃圾收集器在数字窗口关闭后已正确删除所有行对象。
但是如果我运行python2 -i memtest_short.py
,随后在交互式shell中键入缺少的绘图线,则在关闭图形后内存不会被释放。但是,它会在触发plt.close()
,plt.clf()
和gc.collect()
的某些组合后释放。更奇怪的是:每次调用前面提到的命令是不够的,需要至少4次调用的奇怪组合。 Whith ipython -i memtest_short
,只有Ctrl-D最终可以释放内存:(这非常不方便,因为我以交互方式绘制大数据,并且必须在会话中多次绘制相同的数组。
两次我运行相同的python命令python2 -i
。
问题:这可能是这种奇怪/随机行为的来源?你可以重现它吗?
PS:我在linux-3.7.9下使用python-2.7.3和matplotlib 1.2.0