我在一些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()
答案 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()命令。而且内存消耗将很低。