Arbeitsspeicher freigeben

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Antworten
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Arbeitsspeicher freigeben

Beitrag 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?
Gruß,
Magic
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Arbeitsspeicher freigeben

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Arbeitsspeicher freigeben

Beitrag 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.
Gruß,
Magic
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9345
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 100 Mal
Danksagung erhalten: 359 Mal
Kontaktdaten:

Re: Arbeitsspeicher freigeben

Beitrag 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.
Herzlich,
Tom
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Arbeitsspeicher freigeben

Beitrag 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.
Gruß
Hubert
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1991
Registriert: Do, 14. Aug 2008 0:22
Wohnort: Gmunden am Traunsee, Österreich
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Arbeitsspeicher freigeben

Beitrag 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.
Grüsse Herbert
Immer in Bewegung...
Benutzeravatar
Magic
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 343
Registriert: Mo, 11. Jul 2011 12:01

Re: Arbeitsspeicher freigeben

Beitrag 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
Gruß,
Magic
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Arbeitsspeicher freigeben

Beitrag 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.
Gruß
Hubert
Antworten