所以我试着用这个作为基础来做一个置信图:https://www.pythoncharts.com/python/line-chart-with-confidence-interval/
在我的代码中,我让用户选择一个文件夹,其中包含正确格式化的文件,然后将其制作成一个大的 Dataframe 并传递给函数graph1
。我遇到的问题是,每当我再次调用函数graph1
时,内存使用量就会激增很多(100多个文件中有超过100k的数据点,每次调用它都会增加30MB)。
我试过清除子批次和其他与绘图有关的一切,但无济于事。还尝试看看问题是否真的是在函数中产生的,其中所有文件的数据都聚集到一个数据框架中,但那里的一切都被完美地清除,并多次调用,没有导致内存膨胀。
我对自己的Python技能不是很有信心,所以希望有人能指出问题所在。
def menu():
confGUI = tk.Tk()
confGUI.geometry("800x800")
global figConf, graphConf, canvasConf
figConf, graphConf = plt.subplots()
canvasConf = FigureCanvasTkAgg(figConf, confGUI)
canvasConf.get_tk_widget().pack()
graph1(dataThatWasMadeElsewhere)
confGUI.mainloop()
def graph1(df_combined):
# Normalize time from 0 to 1
df_combined['time'] = (df_combined['time']-np.min(df_combined['time']))/(np.max(df_combined['time'])-np.min(df_combined['time']))
df_grouped = df_combined.groupby('time')['y'].agg(['mean', 'std'])
df_grouped.reset_index(inplace=True)
median_std = df_grouped['std'].median()
df_grouped['std'].fillna(median_std, inplace=True) # changing NaN std values to median std
# Smoothing out the mean into a rolling mean. Otherwise it looks bad on graph
window_size = 100
df_grouped['rolling_mean'] = df_grouped['mean'].rolling(window_size, center=True).mean()
df_grouped['lower'] = df_grouped['mean']-df_grouped['std']
df_grouped['upper'] = df_grouped['mean']+df_grouped['std']
graphConf.set_xlabel('Time')
graphConf.set_ylabel('Y')
graphConf.fill_between(df_grouped['time'], df_grouped['lower'], df_grouped['upper'], color='red', alpha=0.2)
# separate plots for each file
for filename in set(df_combined['filename']):
file_data = df_combined[df_combined['filename'] == filename]
graphConf.plot(file_data['time'], file_data['Y'], color="gray", linewidth=0.5)
graphConf.plot(df_grouped['time'], df_grouped['rolling_mean'], color='r', alpha=1, linewidth=5)
canvasConf.draw()
if __name__ == "__main__":
menu()
1条答案
按热度按时间7xzttuei1#
终于找到一个堆栈溢出问题可以帮助我:How can I release memory after creating matplotlib figures
导入gc并在我的图形函数的末尾调用
gc.collect()
修复了它。这里和其他地方提到的其他东西似乎都不起作用。