【问题标题】:How can I release memory after creating matplotlib figures创建 matplotlib 图形后如何释放内存
【发布时间】: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?

更新 - 解决方案:

这些 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()

【问题讨论】:

    标签: python memory-leaks numpy matplotlib


    【解决方案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() 命令即可直接保存任意多次。而且内存消耗会很低。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-06
      • 2011-04-07
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 1970-01-01
      相关资源
      最近更新 更多