seq*_*oia 11 python memory-leaks matplotlib
我正在运行包含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()
Run Code Online (Sandbox Code Playgroud)
unu*_*tbu 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()
Run Code Online (Sandbox Code Playgroud)
你也没有proc.join()
.该join
会阻塞主过程,直到worker
完成.如果省略join
,则主过程将继续worker
在后台运行该过程.
oli*_*oli 11
我在这里找到 http://www.mail-archive.com/matplotlib-users@lists.sourceforge.net/msg11809.html ,它提供了一个有趣的答案,可能有所帮助
尝试更换:
import matplotlib.pyplot as plt
fig = plt.figure()
Run Code Online (Sandbox Code Playgroud)
同
from matplotlib import figure
fig = figure.Figure()
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
6745 次 |
最近记录: |