交互式python shell + pylab:内存问题

时间:2013-02-22 02:35:12

标签: python linux memory matplotlib

考虑两个简单的脚本:

# 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

0 个答案:

没有答案