Micropython, ESP32: 'MemoryError: memory allocation failed, allocating 2819 bytes'

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Äd Franzis
User
Beiträge: 16
Registriert: Donnerstag 11. Februar 2021, 14:55

Hallo, liebes Forum,


meine SW aus diesem Thread 'Web-Page mit Refresh + Simple Web-Crawler gleichzeitig' läuft jetzt ganz brauchbar. Die WEB-Page ignoriert manchmal den Tastendruck, aber damit kann ich leben.

Aber es gibt ein anderes Problem: Nach einiger Zeit bekomme ich die Meldung
"MemoryError: memory allocation failed, allocating 2819 bytes":
Vermute, das hängt mit der Stringverarbeitung für die WEB-Seite zusammen (im Original-Programm ist sie ja aufwändiger). Der Fehler kommt auch an der Stelle, wo der String für die WEB-Seite zusammengebaut wird.

Was ich nicht verstehe: Das Programm läuft z.B. zwanzig Stunden oder auch mehrere Tage fehlerfrei durch und dann crashed wegen MemoryError. Das heißt doch, dass da irgendwelcher Speicher nicht ordentlich aufgeräumt wird, oder? Wie kann ich feststellen, woran der steigende Speicherbedarf liegt?

Was für Maßnahmen kann ich machen, dass der Aufbau der WEB-Seite nicht so viel Speicher frisst?

Ich habe jetzt mal auf blauen Dunst hin

Code: Alles auswählen

micropython.alloc_emergency_exception_buf(100)
in der boot.py ergänzt, aber ich befürchte, das wird das Problem nur verschieben, und dass das Programm dann früher oder später doch wieder crashen wird.
Hat jemand Erfahrung mit dieser Funktion?

Lieben Dank im Voraus.


LG
Äd
__deets__
User
Beiträge: 14528
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du kannst dir die Auslastung über die Zeit hiermit anzeigen lassen: https://docs.micropython.org/en/latest/library/gc.html

Das Problem kann aber auch sogenannte Memory fragmentation sein. Dadurch wird der Speicher nicht weniger, aber in zu kleinen Bruchstücken verfügbar. Und dann kann eine Anforderung ggf nicht mehr bedient werden.

Wenn das passier, muss man Speicher schonend programmieren. Das ist kein einfaches Unterfangen. uPy hat diverse APIs und Änderungen, die das ermöglichen. Zb into-Varianten, bei denen Daten in einen angegebenen Buffer gepackt werden. Statt immer einen neuen. Dadurch kann man einen Wiederverwenden.

Das musst du eben ggf durchziehen.

Ich habe gestern auch eine utemplate Engine gefunden und nutze die in meinem Projekt. Das soll auch Speicher sparen, weil die Webseiten stückweise gebaut & versandt werden.

https://github.com/deets/beehive-monitor

Das sind eben alles so Maßnahmen, die den Erfolg bringen können.
Äd Franzis
User
Beiträge: 16
Registriert: Donnerstag 11. Februar 2021, 14:55

Herzlichen Dank, __deets__, das sind gute Informationen.
Ich werde an der Stelle dann mal weiter Recherchieren. Klingt nach richtig Arbeit :)

Das mit der Speicherfragmentierung erscheint mir passend für mein Problem, da es ja erst nach vielen Durchläufen passiert und ich selber nicht direkt Speicher ansammel.

LG
ÄD
Antworten