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

seq*_*oia 11 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()
Run Code Online (Sandbox Code Playgroud)

unu*_*tbu 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()
Run Code Online (Sandbox Code Playgroud)

你也没有proc.join().该join会阻塞主过程,直到worker完成.如果省略join,则主过程将继续worker在后台运行该过程.


oli*_*oli 11

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

尝试更换:

import matplotlib.pyplot as plt
fig = plt.figure()
Run Code Online (Sandbox Code Playgroud)

from matplotlib import figure
fig = figure.Figure()
Run Code Online (Sandbox Code Playgroud)