我需要使用Python和Matplotlib导出多个图,但是内存管理存在问题。
我在Windows中使用Jupyter Notebook,代码的结构如下面的工作示例所示。基本上,我正在生成几年中的每日情节。
按照内存使用情况,我可以看到通常在前4个“月”中内存使用情况相当稳定,但随后每个“天”增加了15MB以上。使用完整的代码,这会导致内存错误。
我尝试按照建议的here使用plt.close()
。我还尝试了plt.close(fig)
,plt.close('all')
,并使用del
手动删除了一些变量。最后,我将gc.collect
放入了循环中。似乎什么都没有。
import numpy as np
import matplotlib.pyplot as plt
import gc
sz = 1000
i=0
for year in [2014,2015,2016,2017]:
for month in [1,2,3,4,5,9,10,11,12]:
for day in range(1,30):
# Plot
fig, ((ax1,ax2),(ax3,ax4)) = plt.subplots(2,2,figsize=(14,10))
x1 = np.arange(1,sz+1,1)
y1 = np.random.random(sz)
ax1.scatter(x1,y1)
ax2.scatter(x1,y1)
ax3.scatter(x1,y1)
ax4.scatter(x1,y1)
filename = 'test/test_output{}{}{}.png'.format(year,month,day)
plt.tight_layout()
plt.savefig(filename, bbox_inches='tight')
#plt.close(fig)
#plt.close('all')
plt.close()
del x1, y1, ax1, ax2, ax3, ax4, fig
# counter
i=i+1
# Monthly operations
print(filename,i)
gc.collect()
# Triggered outside the loops
gc.collect()
另一方面,如果我中断代码(或等待“内存错误”发生),然后手动运行gc.collect
,则会立即清除内存。
为什么gc.collect
在嵌套循环中没有任何作用?
是否有一种方法可以改善此代码的内存管理?