Speicher Leak?

  • Automatische Ablaufsteuerung -> Fehleranalyse Speichermanagement

    Hallo zusammen,

    #Edit:
    Problem: Mein Script ist vom Arbeitsspeicherverbrauch unmenschlich in die Luft gegangen und ich weiss echt nicht wieso. Ich bin der Meinung alles was irgendwo geöffnet wird wird auch wieder geschlossen und ich kann keine Stelle finden an der immer wieder neue Dinge erstellt werden und nicht gelöscht.

    Denkt daran die config.ini zu bearbeiten falls jemand helfen mag ;) Und die hw.bat ist dafür gedacht, dass ihr euch zum testen Arbeitspläne mit Arbeitspunkte erstellen könnt. Hier die kleine Info, wenn ihr die Interne Funktion _neu_einplanen nicht nutzt, wird der Arbeitsplan immer nur 1x ablaufen ;)

    Grüße

  • Also es ist kein Problem am Script! ^^

    Bei einem Kollegen geht das Script ohne Probleme ... wie man dem anderen Link entnehmen kann, scheint es ein Rechnerproblem zu sein?

    Grüße Yaerox

    Grüne Hölle

  • Ohne _ReduceMemory ist der zugesicherte Speicher von Anfang an höher (Auch der Arbeitsspeicher im Taskmanager(privater Arbeitssatz)) und steigen tut er auch :/

    Im englischen Forum wurde mir nun gesagt:

    Zitat von BrewManNH

    ReduceMemory doesn't reduce the memory used, it just pages it to the hard drive, so it's an artificial reduction in memory. Calling it every 5 seconds is pointless, figure out where your memory leak is coming from before you start trying to find workarounds to bad code.

    It's like you're building a house on mud, every day it sinks a little bit more unless you jack it up, you're not fixing the problem you're just fixing the symptom, the house is still sinking only you don't see that it's happening anymore. Out of sight out of mind is not good coding practice.

    Nun heisst es wohl suche die Nadel im Heuhaufen :/

    Btw. Wegen dem Curserproblem hat niemand eine Idee? ^^

    Grüße Yaerox

    Grüne Hölle

    • Offizieller Beitrag

    Du meinst, weil es auf einem PC das Problem bringt und auf einem anderen nicht, kann das Skript selbst nicht Schuld haben.
    Das ist eine irrige Annahme. Das Skript ist die erste Fehlerquelle. Und solange wir es nicht kennen, ist alles hier nur Stochern im Nebel.
    Wenn du dein Skript nicht zeigen möchtest/kannst/darfst...:
    - Zerlege es in einzelne Module
    - Kompiliere die Module einzeln
    ==> dann hast du eine Chance dich an die Quelle des Übels heranzutasten.

  • komplett Edit

    Für den Code siehe oben

    #Edit: Derzeitiger Wissens-/Vermutungsstand:

    Wenn ich die Funktion vergleiche_zeitstempel() wie folgt änder,

    Spoiler anzeigen
    [autoit]

    Func vergleiche_zeitstempel()
    Local $Row, $Query
    _SQLite_Query($DB, "SELECT geplante_startzeit FROM aufgabenliste ORDER BY geplante_startzeit ASC", $Query)
    _SQLite_FetchData($Query, $Row)
    EndFunc

    [/autoit]

    steigt der Speicher weiter. Dies zieht meine Vermutung irgendwie immer mehr auf SQLite als Ursache :/

    Grüße Yaerox

    Grüne Hölle

    2 Mal editiert, zuletzt von Yaerox (26. November 2012 um 14:00)

  • Setz mal hinter alle die Querys nach diesem Schema

    [autoit]


    If _SQLite_Query($DB, "SELECT geplante_startzeit FROM aufgabenliste WHERE geplante_startzeit LIKE '" & @MDAY & "/" & @MON & "/" & @YEAR & "_________' ORDER BY geplante_startzeit DESC", $Query) <> 0 Then
    Global $sql_error = @error
    _check_sqlite_query_errors()
    Return 0
    EndIf

    [/autoit]

    noch ein

    [autoit]

    _SQLite_QueryFinalize($hQuery)

    [/autoit]


    Du öffnest immer weiter Querys , diese werden aber nicht beendet.
    Weiterhin würde ich diese Abfragen in eine Funktion packen, das macht das ganze übersichtlicher :)
    -EDIT-

    [autoit]

    Func _sqlitequeryceck($DB, $sQuery)
    Local $retQuery
    If _SQLite_Query($DB, $sQuery, $retQuery) <> 0 Then
    _check_sqlite_query_errors(@error)
    _SQLite_QueryFinalize($retQuery)
    Return 0
    EndIf
    Return $retQuery
    EndFunc ;==>_sqlitequeryceck

    [/autoit]

    Dann hast du nurnoch immer eine Zeile, nicht mehr 4 ;)
    Und die _check_sqlite_query_errors Funktion muss nur leicht verändert werden, dann hast du auch noch eine Globale Variable weniger ;)

  • Heyy, das mit dem _SQLite_QueryFinalize hab ich sofort ausprobiert nachdem im englischen Forum ich darauf hingewiesen worden bin. Es scheint sich extrem verbessert zu haben...

    Zu Beginn Zugesicherter Speicher: 15MB, nach 2 Tagen war er auf 2 GB. Nun habe ich diese QueryFinalize noch nicht überall eingebaut aber schon jetzt ist er nach einem Tag auf 18MB und scheint dort aber auch zu bleiben. Ich werde das restliche Script nun bearbeiten.

    Zu deiner Funktion _sqlitequerycheck, ja, ich hab damals sowas gesucht, wusste aber nicht wie eine Parameterübergabe bei Funktionen geht. Wenn ich mir den Text allg. anschaue, ich würde dies jetzt ganz anders machen :D

    Soweit schonmal danke, ich meld mich sobald ich neue Erkentnisse habe :)

    Grüße Yaerox

    Grüne Hölle

  • Also, habe nun einiges umgeschrieben und habe jetzt scheinpar ausschließlich ein Problem mit dem Privaten Speicher.

    Aufgefallen ist, im Leerlauf passiert nichts, nur sobald er 1x etwas gestaret hat geht er hoch, nur danach nicht wieder komplett runter....sprich er erhöht sich um ca. 1 mb geht danach vll 200kb runter ... ich werd den code jetzt nochmal abgrasen...

    Grüße Yaerox

    Grüne Hölle

  • Hallöchen nochmals, ich hoffe irgendwer schaut nochmals hier rein und kann mir vielleicht zur Hand gehen :/

    Hier mal zur verdeutlichung dass der private Speicher leider noch springt: http://www.directupload.net

    Ich habe versucht das Problem einzukreisen, aber irgendwie bin ich momentan nicht mehr wirklich erfolgreich...kleine Erklärung:

    Leerlauf = Prog ist gestartet, der Ablauf ist aber Inaktiv. Es sollte nichts bis auf die Hauptschleife laufen denke ich... KONSTANT
    Leerlauf mit geladenen Arbeitsplänen = Prog ist gestartet, der Ablauf ist aber Inaktiv, Arbeitspläne wurden geladen. Funktionen (wie oben) nur dass 1x die Funktion lade_aktive_aps aufgerufen wurde.
    Leerlauf_Start = Prog gestartet, Ablauf aktiv jedoch in der zeit in der nichts abgearbeitet wird. Funktionen: pruefe_ablauf, vergleiche_zeitstempel
    Ablauf = Prog gestartet, Ablauf aktiv und es laufen Arbeitspläne ab. Funktionen: pruefe_ablauf, vergleiche_zeitstempel, starte_ablauf, _schreibe_log, lade_aktive_aps

    Sieht jemand von euch vielleicht im Code noch einen Fehler der den privaten Speicher steigen lässt? :/ Ich suche und suche und suche nur finde nichts :(

    Grüße

    PS: Es werden Batch dateien bei den Abläufen gestartet, die .txt dateien erstellen, verschieben etc.

  • Probier mal bitte, nur um SQLite auszuschließen, nach dem Aufruf von lade_aktive_aps() einmal die Datenbank neuzustarten

    [autoit]

    lade_aktive_aps()
    _SQLite_Close()
    _SQLite_Shutdown()
    _SQLite_Startup()
    Global $DB = _SQLite_Open($usedb)

    [/autoit]
  • Immer? Weil die Funktion: lade_Aktive_aps() wird mehrmals aufgerufen während des ablaufs...

    #Edit: Habe das mal in die Ablaufschleife implementiert, ich lass das mal kurz ein paar Durchläufe machen, aber es scheint jetzt schon viel schneller zurück zu gehen (der Speicher) ... normal steigt es an und bleibt rel. weit oben, aber das sieht schonmal viel besser aus ... poste gleich genaueres Feedback.

    Grüße Yaerox

    Grüne Hölle

    Einmal editiert, zuletzt von Yaerox (3. Dezember 2012 um 14:37)

  • Habe die Zeilen Code von dir in die Funktion lade_aktive_aps() am ende hinzugefügt:
    Das krasse geschwanke am Ende ist weil ich dort noch anderes gemcht habe ... erstmal net ganz so relevant...
    [Blockierte Grafik: http://s14.directupload.net/images/121203/l6245tjo.png]
    dann hab ich kurz gepennt und hab einen Screenshot vergessen, aber nachdem er sich eingependelt hatte und einfach nur normal lief war es dann so:
    [Blockierte Grafik: http://s14.directupload.net/images/121203/l6245tjo.png]

    Hier ist quasi immernoch von vorher ein kleiner anstieg vom Wert 16.535.552 auf 16.543.744 ... scheinbar wird mehr Speicher als vorher freigegeben, zwar noch nicht alles aber definitiv besser ... jetzt läuft er auf dauer auch auf 16.543.744 geht dann wenn etwas verarbeitet wird hoch und danach wieder auf 16.543.744 runter ...

    #Edit: [Blockierte Grafik: http://s1.directupload.net/images/121203/zaeiquw7.png]

    Zwischendurch gibt es aber immer mal einen Ablauf bei dem es nicht komplett oder fast komplett zurück geht, sondern nur ein wenig und somit bin ich mittlerweile statt bei 16.850.000 bei 17.000.000 ...

    Grüße Yaerox

    Grüne Hölle

    3 Mal editiert, zuletzt von Yaerox (3. Dezember 2012 um 16:02)

  • so, ein paar Sachen habe ich noch gefunden:

    [autoit]

    OnAutoItExitRegister("_Exit")

    [/autoit]


    füg das mal unter

    [autoit]

    Opt("GUIOnEventMode", 1)

    [/autoit]


    ein.
    In die _Exit Funktion füg bitte

    [autoit]

    _SQLite_Close($usedb)
    _SQLite_Shutdown()

    [/autoit]


    vor dem Exit ein

    Damit wird die DLL bei jedem Exit auch wirklich aus dem Speicher geladen.

    Ich schaue mal noch weiter, ob ich noch was finde

  • Wenn ich in der Funktion _starte_ablauf() das lade_aktive_aps mal testweise auskommentieren geht der speicher nachdem etwas abgelaufen ist auch kaum zurück ... auch irgendwie kurios ...

    Grüße Yaerox

    Grüne Hölle