forp循环中的Matplotlib和python垃圾回收

时间:2018-07-23 14:24:53

标签: python matplotlib memory-management garbage-collection

我需要使用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在嵌套循环中没有任何作用?

是否有一种方法可以改善此代码的内存管理?

0 个答案:

没有答案