Утечка памяти в tkinter / matplotlib

Мое приложение содержит большое количество графиков, отображаемых в графическом интерфейсе tkinter. Поскольку matplotlib работает довольно медленно, я хотел потратить как можно меньше времени на обновление графиков для отображения новых данных. Поскольку все мои графики имеют одинаковые размеры, и все данные нормализованы до [0, 1] и имеют 480 точек данных, я перерабатываю одну цифру и один экземпляр участка, чтобы сэкономить время.

from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg from matplotlib.pyplot import figure, subplots_adjust class DataFrame: def __init__(self, master, *args): self.root = Frame(master, ....) # Main app interacts only with this widget .... self.graph_figure = figure(figsize=(3.75, .5), dpi=64) subplots_adjust(left=0, right=239/240, bottom=1/32, top=1) self.graph_plot = self.graph_figure.add_subplot(111) self.graph_plotdata, = self.graph_plot.plot(list(range(480)), [f/480 for f in range(480)]) self.graph_plot.set_xlim(0, 479) self.display_graphs = [Canvas(self.root) for _ in range(16)] for i in range(16): self.display_graphs[i].place(x=760+240*(i//4), y=32*(i % 4), width=240, height=32) def draw_graph(self, title, data): self.graph_figure.suptitle(title) self.graph_plotdata.set_ydata(data) canvas = FigureCanvasTkAgg(self.graph_figure, master=self.root) return canvas.get_tk_widget() def rebuild_graph(self, data, index): self.display_graphs[index].destroy() self.display_graphs[index] = self.draw_graph(self.graph_names[index], data) self.display_graphs[index].place(x=760+240*(index//4), y=32*(index % 4), width=240, height=32) 

Я попытался сделать del canvas перед возвратом виджета в методе draw_graph, но это не помогает. В конце концов он выходит из строя с Fail to allocate bitmap сообщения. Как я могу очистить старые данные явно?


Изменить : после некоторого осмотра кода это, по-видимому, чисто проблема tkinter. Он отказывается выпускать выделенную память в систему и не использует повторно существующую память для новых виджетов, когда старые уничтожаются. Как ни странно, я вижу утечку памяти в этом коде:

 from tkinter import Tk root = Tk() while True: root.update() # Fills up memory indefinitely