Arbeitsspeicher"verbrauch" von Matplotlib

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
Trampas
User
Beiträge: 3
Registriert: Sonntag 3. März 2024, 15:57

Hallo zusammen!

Meine Frage ans Forum bezieht sich auf Matplotlib (Version 3.3.4 unter Raspbian 11) und ist eher technischer Natur.

Code: Alles auswählen

import tkinter as tk
import matplotlib.pyplot as plt

#plt.ion()	

def diagramm_erzeugen():

	plt.plot(zeit_list,temp_list)
	plt.show()
	print('DONE')
	
	
temp_list = [22.9,23.2,23.4,23.5,23.4,23.1]
zeit_list=['12:00','14:00','16:00','18:00','20:00','22:00']
	
haupt = tk.Tk()

btn_diagramm_anzeigen = tk.Button(master = haupt, text="Diagramm anzeigen", command = diagramm_erzeugen)

btn_diagramm_anzeigen.pack()
haupt.mainloop()

Der obenstehende Code-Schnipsel "verbrät" bei jedem Aufruf des Diagramms etwa 2,6MB Arbeitsspeicher, der nicht wieder freigegeben wird. Wobei das beim ersten Aufruf mehr ist und mir auch kein Kopfzerbrechen bereitet. Aber JEDES nachfolgende Öffnen des Diagramms lässt den Speicherbedarf von Python um die besagten 2,6MB ansteigen.

Dazu kommt, dass die "print('DONE')"-Anweisung erst beim Schließen des Programmfensters ausgeführt wird. Das dann aber gleich genau so oft, wie das Diagramm geöffnet wurde.

Beim Einschalten des Interactive-Mode wird "print('DONE')" sofort ausgeführt, noch VOR Schließen des Diagramms. Dadurch machen dann "cla", "clf" oder "close" an dieser Stelle natürlich auch keinen Sinn weil das dann den Plot schließt noch bevor ich was gesehen hab.

Irgendwie komm ich nicht weiter und würde mich freuen, wenn jemand das nachvollziehen kann und ne Idee hat. Entweder hat Matplotlib da nen Bug oder des Problem sitzt wie üblich vor der Tastatur.

Im Voraus schonmal ein liebes Dankeschön
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du hast es ja schon vermutetet - der Fehler liegt in der Herangehensweise. Du benutzt die simple API von matplotlib, die ihren eigenen mainloop nutzt, und machst jedes einzelne Mal ein komplett neues Widget auf. Augenscheinlich mit 2.6MB Speicherfraß.

Die Integration mit tkinter muss analog zu https://matplotlib.org/stable/gallery/u ... gskip.html vonstatten gehen.
Trampas
User
Beiträge: 3
Registriert: Sonntag 3. März 2024, 15:57

Moin und danke erstmal für die schnelle Antwort.

Das bringt mich immerhin soweit woran, als dass ich jetzt weiß wo der Fehler liegt. Auf der anderen Seite hätte eine eingebettete Lösung für mein Projekt - von dem das Diagramm nur ein kleiner Teil ist - zur Folge, dass ich echt alles auf den Kopf stellen müsste. Das war ja gerade der Charme der alten Lösung: unabhängiges Fenster, das auf meinem Minimonitor die GUI ruhig verdecken darf und das ich dann wieder schließen kann.

Wenn jemand DAFÜR nen Lösungsansatz hätte, wär ich dolle dankbar. Ansonsten weiß ich zumindest, in welche Richtung ich suchen muss. Was ja auch schon mal was ist.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das kannst du mit einem neuen Toplevel-Fenster erreichen, in das du den matplotlib-Plot renderst.
Trampas
User
Beiträge: 3
Registriert: Sonntag 3. März 2024, 15:57

Oh oh... Ich bin 66, bitte helf mir über die Straße 8)

Aber danke für den Tipp. Ich hab's bis jetzt mit Tutorials hinbekommen, das schaff ich dann hoffentlich auch noch
Antworten