Debuggen-Variablen, Arrays, LinkedLists-Speicherverbrauch

Anfängerfragen zum Programmieren mit PureBasic.
K.Putt
Beiträge: 122
Registriert: 01.09.2006 00:17

Debuggen-Variablen, Arrays, LinkedLists-Speicherverbrauch

Beitrag 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:
PB 5.x & Win 7 64Bit
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Zuletzt geändert von Kaeru Gaman am 18.04.2007 13:54, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
K.Putt
Beiträge: 122
Registriert: 01.09.2006 00:17

Beitrag 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:
PB 5.x & Win 7 64Bit
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Zuletzt geändert von Kaeru Gaman am 19.04.2007 00:33, insgesamt 1-mal geändert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
K.Putt
Beiträge: 122
Registriert: 01.09.2006 00:17

Beitrag 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.
PB 5.x & Win 7 64Bit
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag 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
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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...
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
manunidi
Beiträge: 109
Registriert: 12.04.2006 22:44

Beitrag 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!
Antworten