如何在创建matplotlib图形后释放内存
我在一些django-celery任务中使用了几个matplotlib函数。
每次调用这些任务时,Python会占用更多的内存。没过多久,Python就会把所有的内存都占满。
问题:我该如何释放这些内存呢?
更新2 - 第二个解决方案:
我曾经问过一个类似的问题,专门关于matplotlib出错时占用的内存,但我得到了一个很好的答案:如果你使用多进程来运行绘图函数,那么就不需要使用 .clf()
、.close()
和 gc.collect()
这些命令,因为一旦进程结束,它的内存会自动被释放。
Matplotlib出错导致内存泄漏。我该如何释放这些内存?
更新 - 解决方案:
这些stackoverflow帖子建议我可以通过以下命令释放matplotlib对象占用的内存:
.clf()
:在循环中绘图时matplotlib内存不足
.close()
:Python matplotlib:指定图形大小时内存未释放
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 个回答
2
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()这个命令。而且,它占用的内存也很少。
6
你有没有试着多次运行你的任务函数(比如用一个for循环)来确认是不是你的函数有问题,而不是celery的原因?
确保你的django.settings.DEBUG设置为False(当DEBUG=True时,连接对象会把所有的查询都保存在内存中)。