Seite 1 von 1

Arbeitsspeicher freigeben

Verfasst: Fr, 30. Mai 2014 12:34
von Magic
Folgendes Problem,

ich arbeite in einem Programm intensiv mit Arrays die als VAR aXXX einer Klasse definiert sind.
Wenn sie gefüllt werden, sehe ich im Taskmanager wie der Bedarf des Arbeitsspeichers für das Programm (stark) ansteigt.
Irgendwann werden die Daten nach Excel exportiert. Ab da an benötige ich die Daten in den Arrays nicht mehr.
Um den benötigten Arbeitsspeicher für das Programm wieder (zumindest) Teilweise frei zu geben werden die Arrays mit ::aXXX := {} freigegeben.
So die Idee.
Im Taskmanager ändert das aber nichts, d.h. dort sehe ich nicht dass sich der Speicherbedarf reduziert. Warum?

Habe ich hier einen Denkfehler?

Re: Arbeitsspeicher freigeben

Verfasst: Fr, 30. Mai 2014 12:43
von Tom
Ich würd's alternativ mal mit ASize(::aArray,0) probieren.

Und einfach abwarten. Der Garbage Collector reagiert nicht sofort, sondern wenn er Zeit hat. PRIVATEs können auch mit RELEASE explizit freigegeben werden.

Re: Arbeitsspeicher freigeben

Verfasst: Fr, 30. Mai 2014 14:48
von Magic
Hallo Tom,

danke für den Hinweis.

Ich habe jetzt beide Varianten ausprobiert, mit mäßigen Erfolg.
Mal scheint es eine direkte Wirkung zu haben, mal nicht.

Re: Arbeitsspeicher freigeben

Verfasst: Fr, 30. Mai 2014 14:55
von Tom
Vorsicht ist geboten, wenn mit dem Zuweisungsoperator vermeintlich ein Array kopiert wird. a1 := a2 erzeugt keine Kopie von "a2". Sondern nur einen Pointer auf "a2" mit dem Namen "a1". Manipuliert man dann a1, tut man das u.U. auch mit a2. Wenn man Arrays kopieren will, sollte man die AClone()-Funktion verwenden.

Re: Arbeitsspeicher freigeben

Verfasst: Sa, 31. Mai 2014 0:56
von brandelh
wenn man eine Variable nicht mehr braucht, sollte man dieser NIL zuweisen, eventuell auch ein sleep(0) hinten dran, damit etwas Zeit für das OS bleibt.

Re: Arbeitsspeicher freigeben

Verfasst: Mo, 02. Jun 2014 6:55
von Herbert
Magic hat geschrieben:ich arbeite in einem Programm intensiv mit Arrays die als VAR aXXX einer Klasse definiert sind.
Die Frage ist, wohin gelangen die Arrays? Warum bleiben die Werte nicht in der Klasse drin? Denn wenn du das Klassenobjekt zerstörst, werden auch deren Variablenräume freigesetzt.
Magic hat geschrieben:Irgendwann werden die Daten nach Excel exportiert.
Würde doch bedeuten, dass erst wenn das Excel entstehen muss, eine eigene in sich geschlossene Prozedur diese Arrays erstellen soll. Dies würde eventuell als Prozedur in einem eigenen Thread verwendet werden können. Und hier ist auch die Zerstörung des Threades für die Freigabe aller darin befindlichen Adressräume zuständig.

Alle andern Massnahmen geben den Adressraum nicht einfach neu organisiert frei.

Re: Arbeitsspeicher freigeben

Verfasst: Mo, 02. Jun 2014 8:47
von Magic
Hi,
Tom hat geschrieben:Vorsicht ist geboten, wenn mit dem Zuweisungsoperator vermeintlich ein Array kopiert wird. a1 := a2 erzeugt keine Kopie von "a2". Sondern nur einen Pointer auf "a2" mit dem Namen "a1". Manipuliert man dann a1, tut man das u.U. auch mit a2. Wenn man Arrays kopieren will, sollte man die AClone()-Funktion verwenden.
Darüber bin ich vor Zeiten gestolpert und verwende seit dem immer die AClone()-Funktion wenn es um das Kopieren von Array geht.
Hier bin ich keiner Gefahr ausgesetzt.
brandelh hat geschrieben:wenn man eine Variable nicht mehr braucht, sollte man dieser NIL zuweisen, eventuell auch ein sleep(0) hinten dran, damit etwas Zeit für das OS bleibt.
Das kann/will ich nicht machen, denn ich verwende die Arrays wieder. Aber vielleicht probiere ich es mal aus.
Herbert hat geschrieben:Die Frage ist, wohin gelangen die Arrays? Warum bleiben die Werte nicht in der Klasse drin? Denn wenn du das Klassenobjekt zerstörst, werden auch deren Variablenräume freigesetzt.
Herbert hat geschrieben:Würde doch bedeuten, dass erst wenn das Excel entstehen muss, eine eigene in sich geschlossene Prozedur diese Arrays erstellen soll. Dies würde eventuell als Prozedur in einem eigenen Thread verwendet werden können. Und hier ist auch die Zerstörung des Threades für die Freigabe aller darin befindlichen Adressräume zuständig.
Es geht hier um ein Auswertungsprogramm, welches in der schnellst möglichen Zeit unterschiedliche Betrachtungsweisen auf aktuell ermittelten Datenmenge zur Verfügung stellt.
Im ersten Schritt werden alle für die Auswertungen benötigten Daten in Array geholt. Quasi "Rohdaten". Dann hat der Benutzer eine Menge Möglichkeiten die Daten nach seinen Wünschen entsprechend auszuwerten. Er wählt quasi aus, wie er seine Auswertung haben will und dann rattert das Programm los und bilden auf Grundlage der Rohdaten seine Auswertung ab. Dabei werden die Daten in Temporäre Arrays geschrieben die anschließend nach Excel exportiert werden. Und auch dass kann der Benutzer mehrfach machen, je nach dem welche Sicht (quasi Excel Vorlage) er haben möchte.
Erst wenn er eine weitere Auswertung startet, die ebenfalls die zuvor ermittelten Rohdaten als Grundlage nimmt, müssen alle temporären Array geleert werden.
Wie gesagt, mal hat das Leeren direkte Auswirkungen die dann im Taskmanager sichtbar sind, mal nicht.

Hoffe konnte ein bisschen Licht ins Dunkel bringen. Eigentlich ist das auch noch deutlich komplizierter und wie man es so schön sagt "historisch gewachsen", deshalb auch vorerst nicht neu / anders programmierbar [-X

Re: Arbeitsspeicher freigeben

Verfasst: Mo, 02. Jun 2014 9:49
von brandelh
Solange genug Hauptspeicher im Rechner ist, macht es aber auch nichts wenn der Speicher einer Anwendung linear anwächst.
Nur wenn diese 24 Stunden 7 Tage laufen würde wäre das ein Problem.
Spätestens wenn die Anwendung beendet wird wird der Speicher freigegeben.