Python Matplotlib错误会导致内存泄漏。我怎样才能释放那些记忆?

Python Matplotlib错误会导致内存泄漏。我怎样才能释放那些记忆?,python,memory-leaks,matplotlib,Python,Memory Leaks,Matplotlib,我正在运行一个django应用程序,它包含matplotlib,允许用户指定图形的轴。这可能导致“溢出错误:超出Agg复杂性” 当这种情况发生时,高达100MB的RAM会被占用。通常我使用fig.gcf()、plot.close()和gc.collect()释放内存,但是与错误相关的内存似乎与plot对象没有关联 有人知道我如何释放记忆吗 谢谢 下面是一些给出Agg复杂性错误的代码 import matplotlib matplotlib.use('Agg') import matplotlib

我正在运行一个django应用程序,它包含matplotlib,允许用户指定图形的轴。这可能导致“溢出错误:超出Agg复杂性”

当这种情况发生时,高达100MB的RAM会被占用。通常我使用
fig.gcf()
plot.close()
gc.collect()
释放内存,但是与错误相关的内存似乎与plot对象没有关联

有人知道我如何释放记忆吗

谢谢

下面是一些给出Agg复杂性错误的代码

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
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.savefig('yourdesktop/random.png')   # code gives me an error here

fig.clf()    # normally I use these lines to release the memory
plt.close()
del a, b
gc.collect()

我假设您可以运行您发布的代码至少一次。只有在多次运行发布的代码后,问题才会显现出来。对吗

如果是这样的话,下面的步骤就避免了问题,而没有真正确定问题的根源。 也许这是一件坏事,但这在紧要关头起作用:只需使用
多处理
在单独的进程中运行内存密集型代码。您不必担心
fig.clf()
plt.close()
dela、b或
gc.collect()
。进程结束时,将释放所有内存

import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
import numpy as np      

import multiprocessing as mp

def worker():
    N=1000000
    a = np.arange(N)
    b = np.random.randn(N)

    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.savefig('/tmp/random.png')   # code gives me an error here

if __name__=='__main__':
    proc=mp.Process(target=worker)
    proc.daemon=True
    proc.start()
    proc.join()
您也不必
proc.join()
join
将阻止主进程,直到
worker
完成。如果省略了
join
,那么主进程将继续执行
worker
进程在后台工作。

我在这里找到 ,它给出了一个有趣的答案,可能会有所帮助

尝试替换:

import matplotlib.pyplot as plt
fig = plt.figure()


我发布的代码第一次就失败了。创建它是为了重现用户在y轴上放大过远以获取高采样率数据的特殊情况。如果一个情节看起来像一团蓝色,没有显示任何白色背景,则代码失败。但是,您的解决方案看起来是一种更好的内存管理方法。我是一个新手,我不完全理解
如果uuuu name\uuuuu=='\uuuuu main\uuuu':
块会发生什么。我将尝试将此添加到我的代码中。你能给我指一个资源来解释发生了什么吗?或者你能提供一个快速的解释。谢谢。@sequoia:在这种情况下,您可能需要限制用户,这样用户在任何情况下都不能请求绘制1e6点。除非您在Windows上,否则不需要使用
if\uuuu name\uuuu…
块。我很乐意尝试解释您的任何具体问题,但我认为在这种情况下,一切都比我能解释的好得多。谢谢,这是一个有用的链接。我将使用您的实现。并采纳你的建议来限制用户请求的范围。哇!我真不敢相信这个变通方法能如此巧妙地解决我的类似问题。当然,这不是根本问题的解决方案。但在紧急情况下,这是一种很好的技术,这种解决方案适用于使用for循环保存多个绘图时出现的错误“MemoryError:in renderragg:Out memory”
from matplotlib import figure
fig = figure.Figure()