我的matplotlib函数在tkinter窗口中显示一个图形时出现内存膨胀问题

ymzxtsji  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(146)

所以我试着用这个作为基础来做一个置信图: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()
7xzttuei

7xzttuei1#

终于找到一个堆栈溢出问题可以帮助我:How can I release memory after creating matplotlib figures
导入gc并在我的图形函数的末尾调用gc.collect()修复了它。这里和其他地方提到的其他东西似乎都不起作用。

相关问题