我有一个循环,将财务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)
这些方法都无法解决此漏洞。有人可以帮帮我吗?谢谢!
答案 0 :(得分:0)
老问题,但最近在创建和保存数字时遇到了同样的问题。 尝试了你所做的所有相同的事情,但没有成功。
最后,在开始进入我的循环之前,添加以下行以关闭 Matplpotlib 中的交互模式。 在运行 +5000 个子图时,内存对我来说是合理的。
plt.ioff()