Matplotlib错误导致内存泄漏。如何释放内存?

15 投票
2 回答
11746 浏览
提问于 2025-04-16 23:58

我正在运行一个Django应用,这个应用使用了matplotlib库,允许用户指定图表的坐标轴。这可能会导致出现‘溢出错误:Agg复杂度超出’的情况。

当这种情况发生时,可能会占用多达100MB的内存。通常,我会通过使用fig.gcf()plot.close()gc.collect()来释放这些内存,但与这个错误相关的内存似乎并不和图表对象有关。

有没有人知道我该如何释放这些内存呢?

谢谢。

以下是一些会让我遇到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()

2 个回答

20

我在这里发现了一个有趣的回答,可能会对你有帮助:

你可以试着把:

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

替换成:

from matplotlib import figure
fig = figure.Figure()
15

我假设你至少能运行你发的代码一次。问题只有在多次运行代码后才会出现,对吧?

如果是这样的话,下面的方法可以避免这个问题,虽然它并没有真正找到问题的根源。也许这不是个好办法,但在紧急情况下可以用:简单地使用 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 进程会在后台工作。

撰写回答