Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit der Speicherauslastung (https://www.delphipraxis.net/135568-problem-mit-der-speicherauslastung.html)

patti 13. Jun 2009 12:25


Problem mit der Speicherauslastung
 
Stehe leider im Moment vor einem kleinen Problem mit der Speicherauslastung meines Programmes und wollte mal fragen, ob das normal ist ;-)
Und zwar geht es darum: Ich habe eine TList mit Objekten. Diese Objekte speichern u.a. jeweils ein JPEG mit den Maßen 240*338 Pixel. Durch eine relativ hohe Kompression haben die Bilder nur etwa 10 KB. Eine Routine geht dann die komplette Liste durch, erzeugt ein 24Bit-Bitmap mit den gleichen Maßen, stretcht das BMP auf die Größe 48x68 runter und fügt es zu einer ImageList hinzu. Die Bitmaps haben alle eine Größe von ca. 10 KB ( 48x68x24/8/1024 KB ). Starte ich das Programm, habe ich zu Beginn etwa eine Speicherauslastung von 2400 KB. Nach Aufruf der Routine mit 15 Elementen steigt meine Speicherauslastung jedoch auf etwa 6000 KB. Etwa 3600 KB kommen also einfach hinzu! Minus die 150 KB für die 15 Bitmap-Elemente in der ImageList, bleiben also etwa 3450 KB übrig. Das entspricht genau der Datengröße von 15 24Bit-Bitmaps in der Größe von 240*338 Pixeln. Allerdings erzeuge ich in der gesamten Routine nur einmal das Bitmap und gebe es am Ende wieder mit FreeAndNil frei. Im Moment hole ich mir das JPEG mit

Delphi-Quellcode:
bmp.Assign(JPEG);
,weil ich das wo gelesen habe. Vorher habe ich es auch schon anders probiert, hat aber nichts verändert.

Hoffe, mein Problem kann gelöst werden. Bei über 300 Elementen in der Liste steigt die Speicherauslastung nämlich drastisch an :-( Danke im Voraus ;-)

Patti

mkinzler 13. Jun 2009 12:35

Re: Problem mit der Speicherauslastung
 
Beim Laden Von JPEGs werden diese in Bitmaps gewandelt, belegen also mehr Speicher. Wie gibst du diese frei?

patti 13. Jun 2009 12:46

Re: Problem mit der Speicherauslastung
 
Die JPEGs selbst bleiben bis zum Programmende erhalten. Ich erzeuge zu Beginn meine Liste und lade anschließend die Objekte aus einem Stream. Dabei werden auch die JPEGs geladen. Erst am Programmende gebe ich alles wieder frei (Liste mit allen Objekte). Während das Programm läuft, scheint es auch keine Probleme zu geben, da der Speicherverbrauch konstant bei etwa 2400 KB bleibt. Erst wenn ich die besagte Routine aufrufe, steigt die Speicherauslastung drastisch an. Die JPEGs selbst brauche ich im Speicher. Kann man das erzeugte Bitmap unabhängig davon wieder freigeben?

Patti

patti 13. Jun 2009 13:07

Re: Problem mit der Speicherauslastung
 
So, hatte Erfolg ;-)
Habe jetzt den Umweg über ein weiteres JPEG genommen. Hab einfach in der Schleife ein JPEG (j) erzeugt, dann mit

Delphi-Quellcode:
j.Assign(JPEG);
das Original-JPEG geladen, mit j weiter gearbeitet und am Ende mit FreeAndNil(j) wieder freigegeben. Der Speicherverbrauch bleibt dabei ziemlich gering. Danke für die Anregung ;-)
Wenn es eine bessere Möglichkeit gibt, dann trotzdem immer her damit :mrgreen:

Patti


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:08 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz