Arbeitsspeicher freigeben
Moderator: Moderatoren
Arbeitsspeicher freigeben
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?
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
Magic
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Arbeitsspeicher freigeben
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.
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
Tom
Re: Arbeitsspeicher freigeben
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.
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
Magic
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9367
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 102 Mal
- Danksagung erhalten: 361 Mal
- Kontaktdaten:
Re: Arbeitsspeicher freigeben
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
Tom
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Arbeitsspeicher freigeben
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
Hubert
- Herbert
- 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
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:ich arbeite in einem Programm intensiv mit Arrays die als VAR aXXX einer Klasse definiert sind.
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.Magic hat geschrieben:Irgendwann werden die Daten nach Excel exportiert.
Alle andern Massnahmen geben den Adressraum nicht einfach neu organisiert frei.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
Re: Arbeitsspeicher freigeben
Hi,
Hier bin ich keiner Gefahr ausgesetzt.
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
Darüber bin ich vor Zeiten gestolpert und verwende seit dem immer die AClone()-Funktion wenn es um das Kopieren von Array geht.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.
Hier bin ich keiner Gefahr ausgesetzt.
Das kann/will ich nicht machen, denn ich verwende die Arrays wieder. Aber vielleicht probiere ich es mal aus.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.
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.
Es geht hier um ein Auswertungsprogramm, welches in der schnellst möglichen Zeit unterschiedliche Betrachtungsweisen auf aktuell ermittelten Datenmenge zur Verfügung stellt.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.
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
Gruß,
Magic
Magic
- brandelh
- Foren-Moderator
- Beiträge: 15697
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 66 Mal
- Danksagung erhalten: 33 Mal
- Kontaktdaten:
Re: Arbeitsspeicher freigeben
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.
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
Hubert