Matplotlib错误导致内存泄漏。如何释放内存?
我正在运行一个Django应用,这个应用使用了matplotlib库,允许用户指定图表的坐标轴。这可能会导致出现‘溢出错误:Agg复杂度超出’的情况。
当这种情况发生时,可能会占用多达100MB的内存。通常,我会通过使用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()
2 个回答
20
我在这里发现了一个有趣的回答,可能会对你有帮助:
你可以试着把:
import matplotlib.pyplot as plt
fig = plt.figure()
替换成:
from matplotlib import figure
fig = figure.Figure()
15
我假设你至少能运行你发的代码一次。问题只有在多次运行代码后才会出现,对吧?
如果是这样的话,下面的方法可以避免这个问题,虽然它并没有真正找到问题的根源。也许这不是个好办法,但在紧急情况下可以用:简单地使用 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
进程会在后台工作。