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

Posted

技术标签:

【中文标题】创建 matplotlib 图形后如何释放内存【英文标题】:How can I release memory after creating matplotlib figures 【发布时间】:2011-10-29 09:46:08 【问题描述】:

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

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

问题:我怎样才能释放这段记忆?

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

我问了一个类似的问题,具体是关于 matplotlib 错误时内存被锁定的问题,但是如果您使用多进程运行在一个单独的进程中绘制函数,一旦进程结束,其内存将自动释放。

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

更新 - 解决方案:

这些 *** 帖子建议我可以使用以下命令释放 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()

【问题讨论】:

【参考方案1】:

您是否尝试多次(在 for 中)运行任务函数以确保无论 celery 是否都不会泄漏您的函数? 确保 django.settings.DEBUG 设置为 False(连接对象在 DEBUG=True 时将所有查询保存在内存中)。

【讨论】:

好建议。 DEBUG 设置为 false。我在 for 循环中多次运行该函数,似乎内存泄漏与我的代码有关。以前我有这个功能作为 django 视图,但是 http 请求时间太长,所以我把它移到了 django-celery 任务。我认为 django 对所有 http 请求都有很好的内存清理,现在我不再受益于它是一项任务。不幸的是,我看不到内存泄漏来自哪里,我尝试删除我在函数中声明的变量以在完成后释放该内存,但这似乎没有任何效果。【参考方案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() 命令即可直接保存任意多次。而且内存消耗会很低。

【讨论】:

以上是关于创建 matplotlib 图形后如何释放内存的主要内容,如果未能解决你的问题,请参考以下文章

触发释放内存的释放?

Unity中如何释放内存?

Java方法内创建对象实例后,啥时候释放内存(引

如何释放手机内存 清理释放安卓手机内存空间方法

如何手动释放Linux内存的方法

如何手动释放Linux内存?