Я прошел через Matplotlib vs Tkinter: Утечка памяти с использованием FigureCanvasTkAgg , Объявление FigureCanvasTkAgg вызывает утечку памяти , Увеличение памяти с помощью matplotlib и tkinter и некоторых других другие, но у меня все еще есть проблема, хотя я не использую pyplot.
При открытии и закрытии фигур matplotlib, встроенных в кадр Tk, как показано в примере matplotlib, мое использование памяти резко увеличивается на каждой фигуре и никогда не освобождается.
Я сузил его до питания FigureCanvasTkAgg память и никогда не освобождает ее, даже когда главный кадр разрушен. В моем примере на самом деле не создается событие Tk frame, просто холст с master = None:
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import time
import gc
time.sleep(1)
for count in range(0,10000):
if count % 10 == 0:
print("Iteration %s" % count)
figure = Figure()
canvas = FigureCanvasTkAgg(figure, master=None)
figure = None
canvas = None
gc.collect()
Запуск с memory_profiler (mprof run script.py) дает следующий результат: mprof result
Сценарий действительно вылетает, не дойдя до конца. Конечно, я не открываю даже около 10 000 фигур во время стандартной сессии с помощью своего приложения, однако я открываю и закрываю фигуры, удерживая несколько графиков с примерно 100 000 точек на каждом. Один или два раза это работает нормально, но в конечном итоге заканчивается нехватка памяти.
Я что-то здесь пропустил? Кто-нибудь знает, в чем дело, что этот холст съедает около 50 МБ каждый раз, когда вы его создаете, и никогда его не выпускаете?
Я использую python 3.8, matplotlib 3.2.0 на Windows 10. Любая помощь будет будут оценены.