如何在创建matplotlib图形后释放内存

84 投票
2 回答
51180 浏览
提问于 2025-04-16 23:50

我在一些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时,连接对象会把所有的查询都保存在内存中)。

撰写回答