AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Arghl...Nachilfe in Speicher-Optimierung gesucht
Thema durchsuchen
Ansicht
Themen-Optionen

Arghl...Nachilfe in Speicher-Optimierung gesucht

Ein Thema von hackyie · begonnen am 13. Aug 2006 · letzter Beitrag vom 13. Aug 2006
Antwort Antwort
hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#1

Arghl...Nachilfe in Speicher-Optimierung gesucht

  Alt 13. Aug 2006, 01:34
ich hab arge Speicherprobleme mit meinem Bilddatenbank- Projekt...und zwar bekomme ich einen out of memory error...naja, ich poste erst einmal ein wenig code:

Delphi-Quellcode:
SL := TStringList.Create;

  for i := 0 to pics.count-1 do
  begin
    setlength(myPics,length(myPics)+1);
    myPics[length(myPics)-1].fileName := pics[i];
    myPics[length(myPics)-1].category := cat;
    myPics[length(myPics)-1].discIndex := discID;
    myPics[length(myPics)-1].keywords := '';
    myPics[length(myPics)-1].date := Now;
    myPics[length(myPics)-1].folder := picfolders[i];

    // Bilddateien speichern
    oldName := folderName + picFolders[i] + pics[i];
    newName := folderName + picFolders[i] + inttostr(length(myPics)-1) + '.jpg';

    renameFile(oldName,newName);
    SL.Add(newName);
  end;
In der for-Schleife werden im Wesentlichen Bildnamen, die vorher aus Dateien gescannt wurden, in mein dynamisches array myPics[] geladen. In meinem Beispiel ist das Array leer und wird um 11.000 EInträge erweitert. Jeder EIntrag hat in etwa 540 Bytes Speicherbedarf --> 6 MB gesamt

Außerdem werden alle 11.000 Dateinamen + Pfad in die Stringlist SL geschrieben. Das ist nötig, weil anhand dieser Liste dann später das Archiv erstellt wird, eine Datei, in der alle 11.000 Bilder gepackt werden.

So nun kommt das Merkwürdige: Wenn ich nur das Array fülle, steigt der RAM-Bedarf um 6 MB an und alles ist gut. Wenn ich nur die Stringliste fülle, steigt der Bedarf kaum merklich an und auch alles ist gut. Aber wenn ich beides zusammen mache (so wie im code oben) dann steigt der Speicherbedarf sprungartig auf 30,40,50, 60 MB und dann...BANG ..out of memory.

- warum ist das so?

- generell: Mein Array wird ja zwangsläufig saugroß, wenn tausende Bilder in der DB sind. Warum bekomme ich memory errors, wozu gibt es ne Auslagerungsdatei...was kann ich anders machen, um auch große Mengen an Daten handhaben zu können?

Danke für die Hilfe...
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Arghl...Nachilfe in Speicher-Optimierung gesucht

  Alt 13. Aug 2006, 01:47
Hallo hackyie,

was ich an deiner Vorgehenweise nicht so ganz verstehe ist, du hast schon eine Liste und speicherst trotzdem nochmal alles neu in zwei neuen Listen? Oder was ist pics?

Gruss
Thorsten
  Mit Zitat antworten Zitat
lizardking

Registriert seit: 2. Sep 2005
76 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: Arghl...Nachilfe in Speicher-Optimierung gesucht

  Alt 13. Aug 2006, 02:35
Moin ;)

Zuerst einmal solltest Du das "setLength" aus der Schleife rausnehmen. Schliesslich weisst Du schon direkt zu Beginn, wie gross das Array letzendlich sein muss.
Dieses staendige setLength erzeugt 'ne Menge Overhead.

Und genau die Stelle duerfte auch Ursache Deines Problems sein. Mutmasse ich jetzt einfach mal so, ohne die tiefsten Geheimnisse des Memory Managers von Delphi zu kennen. Grob vereinfacht duerfte meiner Meinung nach ungefaehr folgendes passieren:

1. Die Laenge von mypics wird auf 1 gesetzt und sagen wir dafuer die Bytes 0-499 reserviert
2. Ein String wird zur Stringliste hinzugefuegt, belegt Bytes 500-599
3. Laenge von mypics wird auf 2 gesetzt. *peng* mypics belegt nun die Bytes 600-1599

Solange Schritt 2 nicht dazwischenfunkt, ist alles wunderbar. Dann kann man einfach das Array etwas vergroessern und die Bytes 0-999 benutzen. Geht aber nicht, da halt in diesem Bereich zwischendurch schon Speicherplatz fuer die Stringliste reserviert ist.

Das hiesse: Abgesehen von den (eigentlich unnoetigen) Kopieraktionen verschiebt sich das Array mypics immer weiter nach hinten im Adressraum. Irgendwann (und das geht sogar recht schnell) ist man dann soweit hinten angelangt, dass es mit 32-Bit nicht mehr adressierbar ist - da hilft dann auch keine Auslagerungsdatei mehr.

Soweit jedenfalls meine Theorie. ;-)

Gruesse,

Lizzy
  Mit Zitat antworten Zitat
hackyie

Registriert seit: 3. Nov 2003
50 Beiträge
 
#4

Re: Arghl...Nachilfe in Speicher-Optimierung gesucht

  Alt 13. Aug 2006, 10:31
gute Idee das, das werd ich gleich mal austesten. Das mit den vielen Stringlisten könnte man auch noch optimieren, muss ich mal schauen.

pics[] und picFOlders[] speichern die Bilddateinamen und -Ordner, so wie sie original auf den Datenträgern vorhanden sind. Die Stringlist SL wiederum spiechert die Dateinamen + Pfade im Zielordner (die Dateien werden zu Thumbnails umgewandelt und temporär gespeichert, der einfachheit halber einfach nur als 1.jpg, 2.jpg....). Von daher brauche ich mehrere Listen.

Edit: das mit setlength und einige umstrukturierungen (frühzeitiges freigeben nichtgenutzter objekte / arrays) hat das Problem gelöst, danke!
Thread(this).Post(this).terminate;
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:19 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