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

发布于 2021-01-29 18:11:31

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

发生这种情况时,最多会占用100MB的RAM。通常,我会使用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()
关注者
0
被浏览
189
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

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

    如果是这样,则下面的方法可以避免问题,而无需真正确定问题的根源。也许这是一件坏事,但这在紧要关头起作用:只需用于multiprocessing在单独的进程中运行内存密集型代码。您不必担心fig.clf()orplt.close()del a,bor 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在后台运行。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看