我正在运行包含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()
答案 0 :(得分:12)
我假设您可以至少运行一次您发布的代码。该问题仅在多次运行已发布的代码后才会显现。正确的吗?
如果是这样,以下内容可以避免问题,而无需确定问题的根源。
也许这是一件坏事,但这有点紧迫:只需使用multiprocessing
在一个单独的进程中运行内存密集型代码。您无需担心fig.clf()
或plt.close()
或del a,b
或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
进程在后台运行。
答案 1 :(得分:11)
我在这里找到 http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html ,它提供了一个可能有帮助的有趣答案
尝试更换:
import matplotlib.pyplot as plt
fig = plt.figure()
与
from matplotlib import figure
fig = figure.Figure()