当前位置: 首页 > 面试题库 >

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

楚建柏
2023-03-14
问题内容

我正在运行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()

问题答案:

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

如果是这样,则下面的方法可以避免问题,而无需真正确定问题的根源。也许这是一件坏事,但这在紧要关头起作用:只需用于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在后台运行。



 类似资料:
  • 我想首先说,这是我第一次必须处理性能,因为这是我第一次开发一个android应用程序。 该应用程序是一个源代码编辑器,在这里你可以打开文件,修改它们,并将它们保存回来。该应用程序由4个部分组成: 导航器视图:包含打开文件的ListView和打开文件夹的TreeView。 代码视图容器:它保存包含实际代码的视图。 代码容器:这是一个小视图,包含一个文本视图和一个自定义EditText(由我扩展Edi

  • 我有一些和等,但是我没有设置。你觉得会是那样吗? 你有什么想法或建议吗? PS:该应用程序在Ubuntu机器上运行 多谢.

  • 我正在玩rxjava,发现如果在活动被销毁之前没有完成订阅,则存在内存泄漏的风险,因为“可观察对象保留对上下文的引用”。如果订阅没有取消订阅,则此类情况的演示之一如下所示。已销毁(来源:https://github.com/dlew/android-subscription-leaks/blob/master/app/src/main/java/net/danlew/rxsubscriptions

  • 问题内容: 所以我有这个C ++程序,它是通过Java程序中的JNI调用的,代码如下: 在倒数第二行中,从不释放而是返回,是否会导致最终的内存泄漏?反正有解决这个问题的方法吗? 还有可能不是返回字符串而是返回布尔值(由LogonUser函数返回),而不是jstring,而是添加了要在方法中传递的“ errormessage”引用,并更新了它?我的Java程序能否看到“ errormessage”的

  • 问题内容: 我正在编写一个测试程序,如下所示: 当用户单击按钮A时,它将打开50个JFrame。 当用户单击按钮B时,它将放置所有通过单击按钮A显示的JFrame。 我发现单击按钮B后内存不会减少。我使用任务管理器(在Windows中为+ + ,并检查“ java”的内存使用情况)确定了这一点。 问题答案: 是的,没有办法,无法解决(不仅在Java PL中), 1)实际上,不要在运行时/运行时创建

  • 严重:web应用程序创建了一个ThreadLocal,其键类型为[org.apache.log4j.helpers.ThreadLocalMap](值为[org.apache.log4j.helpers.ThreadLocalMap@3ac5b23e])和值类型为[java.util.Hashtable](值为[{userhost=192.168.15.90,userid=127,username