如何在创建matplotlib数字后释放内存

时间:2011-08-18 01:28:22

标签: python memory-leaks numpy matplotlib

我在一些django-celery任务中有几个matlpotlib函数。

每次调用任务时,RAM都专用于python。不久之后,python占用了所有的RAM。

问题:如何释放此内存?

更新2 - 第二个解决方案:

我问了一个类似的问题,特别是关于matplotlib错误时锁定内存的问题,但我对这个问题得到了很好的答案.clf().close(),如果不需要gc.collect()您使用多进程在一个单独的进程中运行绘图函数,一旦进程结束,它将自动释放内存。

Matplotlib errors result in a memory leak. How can I free up that memory?

更新 - 解决方案:

这些stackoverflow帖子建议我可以使用以下命令释放matplotlib对象使用的内存:

.clf()Matplotlib runs out of memory when plotting in a loop

.close()Python matplotlib: memory not being released when specifying figure size

import gc
gc.collect()

以下是我用来测试解决方案的示例:

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
from pylab import import figure, savefig
import numpy as np
import gc      

a = np.arange(1000000)
b = np.random.randn(1000000)

fig = plt.figure(num=1, dpi=100, facecolor='w', edgecolor='w')
fig.set_size_inches(10,7)
ax = fig.add_subplot(111)
ax.plot(a, b)

fig.clf()
plt.close()
del a, b
gc.collect()

2 个答案:

答案 0 :(得分:4)

你有没有尝试多次运行你的任务功能(在一个for),以确保不管你的功能是不是芹菜? 确保将django.settings.DEBUG设置为False(当DEBUG = True时,连接对象保存memmory中的所有查询。)

答案 1 :(得分:0)

import matplotlib.pyplot as plt
from datetime import datetime
import gc

class MyClass:
    def plotmanytimesandsave(self):
        plt.plot([1, 2, 3])
        ro2 = datetime.now()
        f =ro2.second
        name =str(f)+".jpg"
        plt.savefig(name)
        plt.draw()
        plt.clf()
        plt.close("all")


for y in range(1, 10):
    k = MyClass()
    k.plotmanytimesandsave()
    del k
    k = "now our class object is a string"
    print(k)
    del k
    gc.collect

使用此程序,您将直接保存所需的多次,而无需plt.show()命令。而且内存消耗将很低。