Out of Memory [1]

Alle Fragen zur Programmierung, die nicht in die speziellen Themen passen
Antworten
Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Out of Memory [1]

Beitrag von Seecosmea » Di 15. Mai 2018, 16:25

Guten Tag,

mein Gambas Programm bekommt viele Daten Strings rein ueber:

Code: Alles auswählen

Exec ["python", "/home/pi/py4.py"] For Input As "py4" 
Diese Daten werden von von meinem Programm in Gambas weiterverarbeitet. Nach 4 bis 6 Stunden bricht mein Gambas Programm ab mit der Meldung: [1] Out of Memory

Die Gambas Konsole ist voll mit den Daten. Kann mir jemand sagen wie man den Speicher loescht / resetet ? Oder wie geht man vor ?

Gruss Seecosmea

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Di 15. Mai 2018, 20:25

Zusatz info:

Mein Gambas Programm bekommt sekündlich JSON string von verschiedenen Sensoren rein. Das Programm gibt nach ca 4 bis 6 Stunden die Error Meldung "[1] Out of Memory" und bricht ab. Dieses passiert in der Entwicklungsumgebung von Gambas und auch wenn das Programm als Ausführbare Datei erstellt worden ist.

Ich vermute das Gambas diese String Informationen alle zwischen speichert und deshalb wenn der Speicher voll ist das ganze Programm stoppt. Als weiteres Indiz das der Speicher zu voll wird ist für mich die Beobachtung das das Programm nach ein paar Stunden träge wird.

Die JSON string's werden sofort ausgewertet und sind danach nicht mehr relevant für das Programm, gibt es eine Möglichkeit den Speicher zu leeren?

über Lösungsvorschläge währe Ich allen Sehr Dankbar!

Gruss aus New York, Seecosmea

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von gambi » Di 15. Mai 2018, 21:49

Benutzt du eine String-Variable, die dann vielleicht überläuft ?

gg

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Di 15. Mai 2018, 23:46

Moin Gambi,

Ich weiss leider nicht ob es das ist was Du beschreibst. Das Programm macht eigentlich was es soll und das auch für mehrere Stunden aber dann wird es langsamer und irgendwann kommt die Error Mitteilung "[1] Out of Memory". Ich habe festgestellt das um so mehr JSON string's reinkommen dieses schon nach ca 4 bis 5 Stunden passiert. Für mich sieht es mehr danach aus als ob das Gambas Programm alle String Daten zwischenspeichert und dann ja überläuft... Hast du eine Lösung dafür ?

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Do 17. Mai 2018, 08:18

Hallo again,

habe nun einen anderen Error code bekommen: "Speicherkapazität überschritten". Den Error Code "[1] Out of Memory" bekomme Ich wenn das Programm als Ausführbare Datei gestartet worden ist.

In der Gambas Entwickungsumgebung / Konsole befinden sich am Ende 2MiB Daten. Diese kommen aber nicht von meinen Sensoren. Ich habe festgestellt das diese Daten die Antwort Strings sind: (UniPi / Evok treiber)

Zum besseren Verständnis hier der Ablauf:

Am Anfang wird ein Pyton Programm gestartet und die String in Gambas umgeleitet:
gambas code
Exec ["python", "/home/pi/py4.py"] For Input As "py4"
Ein Eingang des UniPi Board's wird in Gambas abgefragt:
gambas code
Shell "wget -qO- http://127.0.0.1:88/rest/sensor/26C6DC8400000306" For Input As "py4"
Ausgelesen und weiterverarbeitet werden die Stings: gambas code
Public Sub py4_Read()
End
Die Konsole in der Entwicklungsumgebung füllt sich mit Daten die von einem Pyton Programm zu Gambas umgeleitet werden.
Das Gambas Konsolen Fenster beinhaltet beim Programmabbruch mit dem obigen Error Code 2MiB an Daten.

Ich glaube das der Absturz des Programm verursacht wird weil das Programm irgendwann mit Daten überläuft; Kann man die Daten nicht irgendwie löschen mit memory.clear oder irgendwie so was?

Kann mir jemand helfen.. :?:

Benutzeravatar
gambi
Moderator
Beiträge: 319
Registriert: Mi 8. Mai 2013, 21:46
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von gambi » Do 17. Mai 2018, 09:25

Hallo Seecosmea,
das sieht danach aus, als wenn eine Variable "überläuft".

Eine Stringvariable setzt du mit StringVariablenName="" wieder auf eine Länge von Null zurück.

gg

gambasso
Foriker
Beiträge: 918
Registriert: Sa 17. Mär 2012, 09:55
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von gambasso » Do 17. Mai 2018, 11:20

moin,

Daten, die Du weiterhin brauchst, würde ich auf HDD abspeichern, die Variable dann löschen.
Ansonsten kannst Du ja im Programm die erreichte Größe der Variable auslesen und weiterverarbeiten, löschen oder sonst was mit machen.
Da gibt es mehrere Möglichkeiten.
Gruss

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Di 22. Mai 2018, 18:28

Hallo,

habe nun alle strings ueberprueft aber nichts gefunden, kann ein "Process" auch ueberlaufen?
gambas code
Private $hProcess As Process
Public StromCollection As JSONCollection
gambas code
$hProcess = Shell "python /var/www/rrd/ecounter/Easymeter.py A+" For Read As "StromProcess"
gambas code
Public Sub StromProcess_Read()
                Try StromCollection = JSON.Decode(Last.Readline(), True)
                E_Counter.value = StromCollection[" eCounter "] 
                E_Leistung.value = StromCollection[" eLeistung "] 
                Shell "/usr/bin/rrdupdate /var/www/rrd/Werte/Strom/strom.rrd  N:" & E_Counter.value & " -t E_Counter" & E_Leistung.value & " -t E_Leistung"
                ElektoCheck = 1
If ButtonCase = 1 Then 
                E_Oben2.Text = Format$(E_Counter.value - E_CounterBeginningOfThisDay.value, "#0.00")
                If E_CounterLastDay.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$(E_CounterLastDay.value, "#0.00")
Endif
If ButtonCase = 2 Then
                E_Oben2.Text = Format$(E_Counter.value - E_CounterBeginningOfThisMonth.value, "#0.00")
                If E_CounterLastMonth.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$(E_CounterLastMonth.value, "#0.00")
Endif
If ButtonCase = 3 Then
                E_Oben2.Text = Format$(E_Counter.value - E_CounterBeginningOfThisYear.value, "#0.00")
                If E_CounterLastYear.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$(E_CounterLastYear.value, "#0.00")
Endif
If ButtonCase = 4 Then
                E_Oben2.Text = Format$(((E_Counter.value - E_CounterBeginningOfThisDay.value) * StromEURkwh.Value) + (StromGrundgebuehr.value / 30), "#0.00")
                If E_CounterLastDay.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$((E_CounterLastDay.value * StromEURkwh.Value) + (StromGrundgebuehr.value / 30), "#0.00")
Endif
If ButtonCase = 5 Then
                E_Oben2.Text = Format$(((E_Counter.value - E_CounterBeginningOfThisMonth.value) * StromEURkwh.Value) + StromGrundgebuehr.value, "#0.00")
                If E_CounterLastMonth.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$((E_CounterLastMonth.value * StromEURkwh.Value) + StromGrundgebuehr.value, "#0.00")
Endif
If ButtonCase = 6 Then
                E_Oben2.Text = Format$(((E_Counter.value - E_CounterBeginningOfThisYear.value) * StromEURkwh.Value) + (StromGrundgebuehr.value * 12), "#0.00")
                If E_CounterLastYear.value < 0.1 Then E_Unten2.Text = 0.00 Else E_Unten2.Text = Format$((E_CounterLastYear.value * StromEURkwh.Value) + (StromGrundgebuehr.value * 12), "#0.00")
Endif
If Date(Now) <> Date(E_CouterDateYestderday.Value) Then 
                E_CounterLastDay.value = E_Counter.value - E_CounterBeginningOfThisDay.value
                E_CounterBeginningOfThisDay.value = Format$(E_Counter.value - E_CounterBeginningOfThisDay.value, "#0.00")
                E_CounterBeginningOfThisDay.value = E_Counter.value
                v24Settings["V24Konfiguration/E_CounterBeginningOfThisDay"] = E_CounterBeginningOfThisDay.value ' SET
                E_CounterBeginningOfThisDay.value = v24Settings["V24Konfiguration/E_CounterBeginningOfThisDay", "0"] ' GET
                v24Settings["V24Konfiguration/E_CounterLastDay"] = E_CounterLastDay.value 
                E_CounterLastDay.value = v24Settings["V24Konfiguration/E_CounterLastDay", "0"]
                E_CouterDateYestderday.value = Now()
Endif
If DateDiff(Date(E_CouterDateLastMonth.value), Date(Now), gb.Month) >= 1 Then 
                E_CounterLastMonth.value = E_Counter.value - E_CounterBeginningOfThisMonth.value
                E_CounterBeginningOfThisMonth.value = Format$(E_Counter.value - E_CounterBeginningOfThisMonth.value, "#0.00")
                E_CounterBeginningOfThisMonth.value = E_Counter.value
                v24Settings["V24Konfiguration/E_CounterBeginningOfThisMonth"] = E_CounterBeginningOfThisMonth.value ' SET
                E_CounterBeginningOfThisMonth.value = v24Settings["V24Konfiguration/E_CounterBeginningOfThisMonth", "0"] ' GET
                v24Settings["V24Konfiguration/E_CounterLastMonth"] = E_CounterLastMonth.value 
                E_CounterLastMonth.value = v24Settings["V24Konfiguration/E_CounterLastMonth", "0"]
                E_CouterDateLastMonth.value = Now()
Endif
If DateDiff(Date(AbrechnungsstartElec.Value), Date(Now), gb.year) >= 1 Then 
                E_CounterLastYear.value = E_Counter.value - E_CounterBeginningOfThisYear.value
                E_CounterBeginningOfThisYear.value = Format$(E_Counter.value - E_CounterBeginningOfThisYear.value, "#0.00")
                E_CounterBeginningOfThisYear.value = E_Counter.value
                v24Settings["V24Konfiguration/E_CounterBeginningOfThisYear"] = E_CounterBeginningOfThisYear.value
                E_CounterBeginningOfThisYear.value = v24Settings["V24Konfiguration/E_CounterBeginningOfThisYear"]
                v24Settings["V24Konfiguration/AbrechnungsstartElec"] = AbrechnungsstartElec.Value
                AbrechnungsstartElec.Value = v24Settings["V24Konfiguration/AbrechnungsstartElec", "0"]
                AbrechnungsstartElec.Value = Now()
                FMain.v24Settings["V24Konfiguration/AbrechnungsstartElec"] = AbrechnungsstartElec.Value
Endif
StromCollection.Clear()
End
Das Programm ist dieses Mal mit der Meldung "zu wenig Speicherplatz" nach 4 Stunden abgebrochen..
Vielen Dank im Voraus fuer Eure Ideen..

SommerWin
Foriker
Beiträge: 45
Registriert: Do 26. Jan 2017, 20:02
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von SommerWin » Di 22. Mai 2018, 22:04

Hallo,
was passiert denn wenn das Python Script alleine, also ohne Umleitung der Ausgabe auf dem Server läuft?

schöne Grüsse
Kurt

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Di 22. Mai 2018, 23:34

Ich werde es mal ausprobieren...
Ist es denn nicht so das die Daten einfach von Python nach Gambas umgeleitet werden. Die Daten sollen nach der Auswertung einfach verschwinden.....

Hier mal der Python Code womit Gambas meine 1-wire Daten bekommt: shell code
#!/bin/bash

import websocket
import json

url = "ws://127.0.0.1:88/ws"

def on_message(ws, message):
    obj = json.loads(message)
    dev = obj['dev']
    circuit = obj['circuit']
    value = obj['value']
    print message

def on_error(ws, error):
    print error

def on_close(ws):
    print "Connection closed"

#receiving messages
ws = websocket.WebSocketApp(url, on_message = on_message, on_error = on_error, on_close = on_close)
ws.run_forever()

#ws = websocket.WebSocketApp(url, on_message = on_message, on_close = on_close)
gambas code
$1wire = Exec ["python", "/home/pi/py4.py"] For Input As "py4"

tux_
Moderator
Beiträge: 950
Registriert: Di 11. Nov 2008, 20:05
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von tux_ » Mi 23. Mai 2018, 18:55

Gambas-Variablen haben einen Referenzzaehler. Was nicht mehr gebraucht wird (in dem Sinne, dass es von irgendeiner Variable irgendwo referenziert wird), dann wird es geloescht. Ein manuelles Aufraeumen des Speichers ist eigentlich nicht notwendig -- aber du musst darauf achten, dass du nicht selbst unnuetze Daten irgendwo abspeicherst, in einem Array zum Beispiel.

Mir fallen spontan zwei weitere Sachen ein: (1) Wie schnell kommen die Daten im Gambas-Prozess an? Sind es mehr Daten als Gambas pro Zeitintervall verarbeiten kann? Wenn ja, dann _kann_ es sein (ich kenne die Interna nicht so genau), dass Gambas sie puffert und irgendwann voll ist. (2) Es kann natuerlich irgendwo in Gambas immer ein Speicherleck geben, allerdings wuesste ich nicht, wann ich das letzte Mal davon gehoert haette. Du koenntest das Programm mal unter valgrind laufen lassen und nach ein paar Stunden mit Ctrl+C toeten.

Einen kleinen Absatz ueber valgrind gibt es im Wiki [1], aber wir wollen es wie folgt aufrufen:
shell code
$ valgrind --log-file=valgrind.out --leak-check=full --show-reachable=yes gbx3 2>valgrind.err
Die Ausfuehrung unter valgrind macht das Programm sehr viel langsamer. Vielleicht erfahren wir damit sogar, ob Vermutung (1) stimmt oder nicht. Beachte bitte, dass ich nicht vorhersagen kann, wie groß die Ausgabedateien valgrind.{out,err} werden. Vermutlich sehr groß. Beobachte sie ein bisschen und Ctrl+C'e den Prozess schon frueher, wenn sie dir zu groß werden. Und wie immer wenn man mit OOM-Fehlern spielt: ulimits setzen, bevor man das speicherhungrige Programm ausfuehrt:
shell code
$ ulimit -m 3145728 && ulimit -v 3145728  # 3 GiB Obergrenze
Wenn das nichts bringt, koennten wir uns als naechstes anschauen, ob JSON oder Settings das Problem sind. Ich wuerde auf jeden Fall erstmal auf das kontinuierliche Schreiben in v24Settings verzichten. Wer weiß, ob nicht die Settings alte Daten akkumulieren?

[1] http://gambaswiki.org/wiki/doc/report#t6
Achtung: Es passiert, dass ich einen frisch geschrieben Beitrag innerhalb von 10 Minuten noch 3-4 Mal aendere!

Seecosmea
Foriker
Beiträge: 30
Registriert: So 17. Sep 2017, 15:05
Wohnort: Leer (Ostfriesland)
Kontaktdaten:

Re: Out of Memory [1]

Beitrag von Seecosmea » Di 29. Mai 2018, 20:43

Hallo Tux,

habe mir die Seite heruntergeladen, werde alles ausprobieren.
Vielen Dank und Gruesse von den Azoren. (habe nur kurz Internet:)

Seecosema

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 Gäste