Einzelnen Beitrag anzeigen

hackyie

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

Arghl...Nachilfe in Speicher-Optimierung gesucht

  Alt 13. Aug 2006, 00: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