Matplotlib内存泄漏

时间:2017-07-26 00:12:16

标签: matplotlib memory-leaks

我有一个循环,将财务OHLC价格数据转换为rgb像素数据。这个过程是:

1,获取OHLC价格数据

2,使用Matplotlib finance将OHLC数据绘制成图像

3,从fig.canvas获取rgb像素数据

对于这个程序,我将50个价格数据绘制到一个图表中,并将四个增量图表堆叠成一个,所以每个像素数据得到(120 * 120 * 4)。由于这将导致打开和关闭数千个matplotlib子图,因此我有大量内存泄漏。

我已经尝试了基本上所有方法来处理这种泄漏,包括:

1,plt.close('all'),

2,del fig,ax

3,使用fig = figure.Figure(),而不是fig,ax = plt.subplots()

我也尝试将mattlotlib后端从Qt4agg更改为agg,但泄漏仍然存在。我甚至尝试过多处理过程,但仍然无法解决问题。

代码在这里:

    def get_data(file_dir):
      data = pd.DataFrame.from_csv(file_dir)
      return data

    file_dir = 'C:/Users/czzis/Desktop/DATA/EURUSD_ALL/DAT_MT_EURUSD_M1_2016.CSV' 
    data = get_data(file_dir)

    b = []
    start = 0
    idx = 50
    stack = 4

    for i in range(22370):   

        a = np.zeros(shape = (120,120,1))

        for i in range(stack):

            opens = data.iloc[start+i : idx+i ,1].as_matrix()
            highs = data.iloc[start+i : idx+i ,2].as_matrix()
            lows = data.iloc[start+i : idx+i ,3].as_matrix()
            closes = data.iloc[start+i : idx+i ,4].as_matrix()

            # We would draw the chart first and then get the rgb data 
    #       fig = figure.Figure()
    #       ax = fig.add_axes([1, 1, 1, 1])
    #       ax.set_axis_off()

            fig, ax = plt.subplots()
            plt.axis('off')
            matplotlib.finance.candlestick2_ohlc(ax, opens, highs, lows, closes, width=0.6, colorup='w', colordown='k', alpha=1)
    #       print(i)
    #       del fig
    #       canvas = FigureCanvas(fig)

    #       fig.set_canvas(canvas) 
            fig.canvas.draw()   
            observation = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='')
            observation = observation.reshape(fig.canvas.get_width_height()[::-1] + (3,))       

            # Process Data
            observation = skimage.transform.resize(observation,(120,120))  
            observation = np.delete(observation,np.s_[1:4], axis = 2)  
            observation = np.reshape(observation,(120,120,1))   # a is the final shrinked image data we need 

            a = np.append(a,observation,axis = 2)  

    #       matplotlib.pyplot.close('all')
    #       plt.clf()
            plt.show()
            plt.close('all')
    #       del fig,ax
    #       plt.close("all")
    #       del fig,ax
    #       print()
    #       del fig.canvas

        observation = np.delete(a,np.s_[0:1],axis = 2)
        start += 1
        idx   += 1

        b.append(observation)    

这些方法都无法解决此漏洞。有人可以帮帮我吗?谢谢!

1 个答案:

答案 0 :(得分:0)

老问题,但最近在创建和保存数字时遇到了同样的问题。 尝试了你所做的所有相同的事情,但没有成功。

最后,在开始进入我的循环之前,添加以下行以关闭 Matplpotlib 中的交互模式。 在运行 +5000 个子图时,内存对我来说是合理的。

plt.ioff()