matplotlib und MemoryError: In RendererAgg: Out of memory

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
Papa Brummbär
User
Beiträge: 4
Registriert: Montag 20. März 2023, 22:32

Hallo Pros,

leider bin ich für mein Problem nicht richtig Lösung gefunden oder habe das Problem falsch interpretiert?

Flgende Situation es werden Daten aufgenommen diese in eine Liste gepackt und alle 15min. ein Plot erzeugt. Nach ca. 306 Durchläufen
erhalte ich folgende Fehlermeldung:

-> MemoryError: In RendererAgg: Out of memory

Die Programmstruktur sieht wie folgt aus:

Code: Alles auswählen

import matplotlib.pyplot as plt
...
gtepin=[]
...
while True:
...
	gtempin.append(mw)
...
...
        fig, ax = plt.subplots()
        ax.plot(x, gtepin, label='TEXT')
        ax.plot(x, grfin, label='TEXT')
        ax.axis([0, len(gtepin), -20, 100])
        ax.set(xlabel='in 24h '+ str(len(gtepin)) + ' TEXT, ylabel='TEXT' , title='TEXT')
        ax.grid()
        ax.legend()
        fig.savefig('/home/pi/MySky/mydb/mychart.png', dpi=300)    
        plt.close("all")
        plt.close()
        gc.collect()
...
...

Wie schon erwähnt kommt der Fehler nach ca. 306 Speichervorgängen oder nach ca. 24 Stunden.
Jetzt meine Frage ist dieser Memoryfehler wirklich vom plot bzw. "matplotlib" verursacht oder ist das sogar ein Zeitproblem (24h usw.)?
Oder ist hier ggf. die Liste gtepin dafür mitverantwortlich wobei da sind ca. 1530 Werte zum Zeitpunkt des Fehles drin?

Da ich nicht alles in Python kann und mir der Überblick fehlt bin ich mir nicht sicher was ich da machen soll?

Für einen Tip bzw. Beispiel wäre ich sehr dankbar!

Vielen Dank im Voraus und
LG Hampo
Benutzeravatar
__blackjack__
User
Beiträge: 13123
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Papa Brummbär: Die Frage lässt sich so nicht beantworten. Kann sein, kann aber auch nichts ein. Wir wissen ja nicht was das Programm sonst noch so macht. Und auf Modulebene global so alles ansammelt. Speicherverwaltung in Python bedeutet eigentlich nur sinnvoll auf Funktionen aufteilen. Alles andere erledigt die Laufzeitbibliothek.

Es werden schlechte Namen verwendet. `gtempin`, `gtepin`, `grfin` sind nicht wirklich selbsterklärend.

Die drei letzten Zeilen sollte es nicht geben. In einem normalen Programm würde ich die Finger vom `pyplot`-Modul lassen und ``gc.collect()`` ist was zur Fehlersuche in Python, nicht etwas was man in einem regulären Programm verwenden würde.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich empfehle mal https://docs.python.org/3/library/tracemalloc.html durchzulesen und dem zu folgen. Das gibt dir ggf. Hinweise.

matplotlib ist auch nicht so doll für dynamische Plots finde ich. Da benutze ich lieber plotly, das braucht dann aber natürlich einen Browser zur Darstellung.
Papa Brummbär
User
Beiträge: 4
Registriert: Montag 20. März 2023, 22:32

Also vielen Dank für die schnelle Antwort, ich selbst bin kein Profi-Programmierer, bin zwar mit der EDV-Welt oder die EDV-Welt mit mir groß geworden. Doch jetzt sind zu viele Unterschiede zwischen PC, Arduino, Pi usw. und die Strukturen sind auch anderes was natürlich auf Grund der Hardwarearchitektur auch sein muss.

Eigentlich ist das Programm ganz einfach, es werden von mehreren Sensoren über I2C Daten gesammelt diese in der DB gespeichert und zeitgleich für den 24h Verlauf die Daten gelistet um sie über matplotlib zu visualisieren. Leider kommt irgendwann wenn ich die Grafen gemacht werden dieser Fehler woran das liegt, wer den Speicher benötigt usw. ??? Die drei Zeilen habe ich bei der Suche gefunden aber diese haben auch keine Änderung gebracht. Ich werde mal den Link verfolgen. Vielen Dank!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Gibt es einen Grund, da nicht auf die bewährten stacks wie zb grafana zu setzen? Das ist ja nun wirklich ein gründlich wieder und wieder erfundenes Rad.
Antworten