Seite 1 von 2

Debuggen-Variablen, Arrays, LinkedLists-Speicherverbrauch

Verfasst: 18.04.2007 13:10
von K.Putt
Hallo,
ich habe ein Programm geschrieben das einige Schleifen enthält,
die Arrays und LinkedLists füllen.
Leider steigt der Speicherverbrauch des Programms von anfänglich etwa 30MB auf über 800MB an und ich weiss nicht, an welchem Array oder welcher LinkedList es liegen könnte, da ich diese eigentlich vor jedem Durchlauf entleere,
natürlich ist es auch möglich, dass ich etwas übersehen habe, bzw. einen Fehler gemacht habe.

Ist es möglich mir den Speicherverbauch einzelner Arrays oder LinkedLists in einem Programm beim Starten Debuggen zu lassen, ohne extra Codezeilen einzufügen (Debug...).

Sollte es so nicht gehen, wäre ich natürlich auch für den speziellen Debug Code dankbar.

:allright:

Verfasst: 18.04.2007 13:52
von Kaeru Gaman
die IDE enthält doch einen Variable-Viewer...


> mir den Speicherverbauch einzelner Arrays oder LinkedLists in einem Programm beim Starten Debuggen zu lassen
beim starten wär ja sinnlos, meinst nich?

aber eigentlich solltest du wissen, wieviel platz deine Arrays und listen brauchen, das ist doch nicht so schwierig zu berechnen.

ein Array braucht soviel wie die größe der struktur die ein element bildet multipliziert mit der größe des arrays, +16 byte für das Array selber.

also z.b.
Dim test.l(999) => 4 x 1000 + 16 = 4016 byte
Dim test.l(999,999) = 4 x 1000 x 1000 + 16 = 4.000.016 byte

eine linked list braucht pro element 8 byte mehr als ein arrayelement derselben struktur.
also, ein listenelement des typs LONG braucht 4 + 8 byte pro element,
also bei 1000 elementen dann 12.000 byte.

diese 4byte für ein einzelnes Long sollte dir bekannt sein.
wiviel platz deine struct benötigt, kannst du dir mit
Debug SizeOf(struct) ausgeben lassen.


wenn sich allerdings dein prog im laufe der zeit auf 800MB aufbläst,
und du rechnerisch nicht ansatzweise soviel speicher benötigen würdest,
dann hast du irgendwo ein speicherleck, setzt was nicht wieder richtig frei.

Verfasst: 18.04.2007 13:54
von Tafkadasom2k5
Heyho :)

Es gibt einen Befehl, der nennt sich "SizeOf". Ob der bei LLs funktioniert, weiß ich aber nicht.

Ansonsten muss du "manuell debuggen"-> jedes Mal, wenn du deinem Array was hinzufügst, zählst du die Bytes (len()), und addierst sie zu einer (globalen) Variable.

Gr33tz
Tafkadasom2k5

Verfasst: 19.04.2007 00:23
von K.Putt
Hallo,
also die LinkedList() oder das Array sind es nicht.

Diese Funktion verwende ich:
http://www.purebasic.fr/german/viewtopi ... c&start=20

Mein Programm ruft diese Funktion über 1000x auf, jedesmal wird im Webgadget ein neuer Link geöffnet.
Das Webgadget öffnet diesen Link, kopiert den Code, Code wird verarbeitet...NEXT :-)

Ganz interessant nun ist folgendes und das kann ich mir nicht erklären:

Habe ich mein GUI Fenster offen (mit Panel, auf einem Panel liegt das Webgadget), so wächst der Speicherverbrauch stetig an.
Klicke ich das Fenster aber nach unten in die Taskleiste - schwupps ist der Speicher wieder frei (von mittlerweile z.b. 800MB bei etwa 1000 Aufrufen auf 15MB wie etwa bei Start des Programms).
Nun wächst der Speicherverbauch wieder an !!!
Also öffne ich das Fenster wieder und lege es danach wieder in die Taskleiste.
Trala, der Speicher ist wieder frei.

Warum ?!? :freak:



:twisted:

Verfasst: 19.04.2007 00:27
von Kaeru Gaman
anscheinend freed das webgadget seinen inhalt nicht.
also, der alte inhalt wird erst freigegeben, wenn das programm zusammengeschrumpft wird, nicht vorher.

probier doch mal, das webgadget zu löschen und wieder zu erstellen,
jedes mal vor bevor du auf den nächsten link zugreifst.

ist zwar holzhammer, aber es klärt erstmal auf, ob es wirklich daran liegt,
dann kann man gezielt ne bessere lösung suchen.

PS:
vielleicht genügt es schon, dem webgadget erstmal explicit keinen inhalt zuzuweisen,
bevor man den neuen inhalt zuweist.
...aber im endeffekt rate ich nur rum, geb nurn tipp, was man tun könnte, um die ursache einzukreisen...

Verfasst: 19.04.2007 00:32
von Kiffi
K.Putt hat geschrieben:Das Webgadget öffnet diesen Link, kopiert den Code, Code wird verarbeitet...NEXT :-)
mh, eigentlich gibt's elegantere und schnellere Möglichkeiten, HTML aus dem
INet auf die Platte zu laden [1]. Gibt's einen besonderen Grund, warum Du das
WebGadget dafür nimmst? Wenn Du es nur zum Speichern verwendest, dann
ist das ein wenig oversized.

Grüße ... Kiffi

[1]: http://www.purebasic.fr/german/viewtopi ... 258#101258

Verfasst: 19.04.2007 01:17
von K.Putt
@ Kaeru Gaman:

Also Löschen und Neu Erstellen oder Verstecken des Gadgets ändern nichts,
es scheint doch irgendwie mit der Funktion zusammenzuhängen.

@ Kiffi:

Mit dem Webgadget kann man Javascript (Formulare) auslösen (durch direktes anhängen von Code), oder direkt auf Javascript Funktionen zugreifen.

[Es gibt noch andere Gründe, darüber möchte ich aber öffentlich nicht so gerne sprechen :twisted: ]


EDIT:

Ich habe mal weiter experimentiert:
-Also bei Webseiten mit mehr HTML Code wächst der Speicherverbrauch erwartungsgemäss schneller.
-Ich schreibe Teile des Codes in jedem zyklus in eine Datei, ich habe dabei 2 Methoden getestet:
1.Datei bleibt geöffnet und Code wird angehangen
2.Datei wird bei jedem Zyklus neu geöffnet und wieder geschlossen.
Ergebnis erwartungsgemäss unverändert.

Die Grösse der Datei beträgt am Ende etwa 10MB (~75.000 Zeilen), der Speicherverbauch etwa 900MB, steht also auch in keinem Verhältnis und sollte nichts damit zu tun haben.


EDIT2:

-XP Skin disabled
-Webgadget aus der Panelliste genommen und auf das Hauptfenster gelegt, Grösse auf 0,0 reduziert.

Keine Änderung.

Verfasst: 19.04.2007 08:43
von Tafkadasom2k5
K.Putt hat geschrieben:Ich schreibe Teile des Codes in jedem zyklus in eine Datei, ich habe dabei 2 Methoden getestet:
1.Datei bleibt geöffnet und Code wird angehangen
2.Datei wird bei jedem Zyklus neu geöffnet und wieder geschlossen.
Ergebnis erwartungsgemäss unverändert.
"Erwartungsgemäß" müsste Öffnen und Schließen vor jedem Lesen/Schreiben einer Datei zu einem eheblichen Geschwindigkeitsverlust führen...oder? :?

Gr33tz
Tafkadasom2k5

Verfasst: 19.04.2007 09:54
von Kaeru Gaman
es geht ja garnich um geschwindigkeit. :?


also, ich vermute der speicherverbrauch geschieht durch die zusatzelemente, also bilder etc.,
die nicht innerhalb des sourcecode sitzen sondern nur für webdarstellung geladen werden.

dass diese im speicher verbleiben, solange das fenster groß ist,
aber verschwinden, wenn man es minimiert, ist ein interessanter effekt.
ich würde das direkt auf windows zurückführen.

solange ein fenster geöffnet ist, werden grafikinformationen im speicher gehalten,
die bei einem refresh benötigt würden.
wird das fenster minimiert, wird dieser speicher freigegeben.

dass ein prozess mit minimiertem fenster wesentlich weniger speicher verbraucht,
ist mir schon des öfteren aufgefallen.

hier scheint es jetzt so zu sein, dass der inhalt des gadgets ganz
normal im speicher bereitgehalten wird für einen refresh.
bei einem ButtonImageGadget wird das auch so gemacht.
dass sich der inhalt x-mal ändert und massig daten dazukommen,
darum kümmert sich windows anscheinend nicht.

abhilfe:
sende deinem eigenen fenster vor dem nächsten ladevorgang ein minimize/maximize.
holzhammer, aber dann is ruh.

...was es mit dem speicher-overhead des gadgets auf sich hat,
ist dann eine andere frage, die man mal an freak & co. herantragen müßte...

Verfasst: 19.04.2007 10:49
von manunidi
Hab mich mit so diesem bzw. ähnlichem Phänomen auch vor kuzrem auseinandergesetzt!

Probier mal in der "Window Schleife" den Befehl

RemovePagefaults(PID)

aus PBOSL auszuführen!!!

Sollte den Speicher freigeben!