【问题标题】:Memory overflow when saving Matplotlib plots in a loop在循环中保存 Matplotlib 图时内存溢出
【发布时间】:2013-05-04 06:39:58
【问题描述】:

我正在使用迭代循环来使用 Matplotlib 绘制 soame 数据。当代码保存了大约 768 个绘图时,它会抛出以下异常。

RuntimeError: Could not allocate memory for image

我的电脑有大约 3.5 GB 的 RAM。 有没有什么方法可以并行释放内存,以免内存耗尽?

【问题讨论】:

    标签: python memory-management matplotlib


    【解决方案1】:

    当你完成它们时,你还记得close 你的数字吗?例如:

    import matplotlib.pyplot as plt
    
    #generate figure here
    #...
    plt.close(fig)  #release resources associated with fig
    

    【讨论】:

    • 是的,我没有关闭这个数字。非常感谢。但是我遇到了一个例外: Traceback(最近一次调用最后一次):文件“C:\Python27\lib\site-packages\matplotlib\backends\backend_qt4.py”,第 156 行,在 lambda: self.close_event( )) 文件“C:\Python27\lib\site-packages\matplotlib\backend_bases.py”,第 1564 行,在 close_event self.callbacks.process(s, event) RuntimeError: Wrapped C/C++ object of type FigureCanvasQTAgg has been deleted
    • 似乎与其中一个后端很有趣。您是否正在修改合并了哪些后端? (FWIW,我怀疑我会知道这个问题的答案,经过更多调查后可能值得打开另一个问题)
    • 这是 QT4 后端的一个错误,它们在其中被轻微破坏,c++ 对象在mpl 真正完成之前由pyqt 释放和清理。忽略这些错误是安全的,并且它已在主干上修复(我不记得该修复是否包含在 1.2 错误修复版本中)
    【解决方案2】:

    作为一个略有不同的答案,请记住您可以重复使用数字。比如:

    fig = plt.figure()
    ax = plt.gca()
    
    im = ax.imshow(data_list[0],...)
    
    for new_data in data_list:
        im.set_cdata(new_data)
        fig.savefig(..)
    

    这将使您的代码运行得更快,因为它不需要设置和拆除图形 700 多次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 2011-01-22
      • 2020-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多