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

时间:2011-08-19 18:20:20

标签: python memory-leaks matplotlib

我正在运行包含matplotlib的django应用程序,并允许用户指定图形的轴。这可能会导致'溢出错误:Agg复杂度超出'

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

有谁知道如何释放那段记忆?

感谢。

以下是一些代码,它给出了Agg Complexity Error。

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

2 个答案:

答案 0 :(得分:12)

我假设您可以至少运行一次您发布的代码。该问题仅在多次运行已发布的代码后才会显现。正确的吗?

如果是这样,以下内容可以避免问题,而无需确定问题的根源。 也许这是一件坏事,但这有点紧迫:只需使用multiprocessing在一个单独的进程中运行内存密集型代码。您无需担心fig.clf()plt.close()del a,bgc.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进程在后台运行。

答案 1 :(得分:11)

我在这里找到 http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html ,它提供了一个可能有帮助的有趣答案

尝试更换:

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

from matplotlib import figure
fig = figure.Figure()