Autor Beitrag
ChrisWF
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 17.03.06 14:32 
Hi Leute,

ich hab mir in Delphi einen ICQ History Viewer programmiert. Über readln lese ich dabei zeile für zeile in einen dynamischen String-array ein. Nur leider kommt(erst während der Laufzeit) bei größeren Dateien der Fehler "Arbeitsspeicher zu klein". An sich kann er nicht zu klein sein(1 GB), aber ich vermute, dass Delphi sich nur einen bestimmten Bereich des Arbeitsspeichers reserviert. Kann man den irgendwie vergrößern. Oder, wenn meine Vermutung falsch ist, gibt es eine andere Möglichkeit ???

Hier mal der Code(ist nix besonderes):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var Lines: array of string;

function getLines: boolean;
var fdatei: textfile;
begin
     form1.opendialog1.execute;
     assignfile(fdatei,form1.OpenDialog1.FileName);
     reset(fdatei);
     repeat
           setlength(lines,length(lines)+1);
           readln(fdatei,lines[high(lines)]);
     until eof(fdatei);
     closefile(fdatei);
end;
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.03.06 14:44 
ausblenden Delphi-Quelltext
1:
setlength(lines,length(lines)+1);					

Das ist tödlich. Denn was passiert hier? Der Delphi-Speichermanager (DSM) reserviert einen neuen Speicherblock, der genau ein element größer ist als der alte, dann kopiert er den Inhalt, des alten Arrays in den neuen Speicherblock. Aber er gibt den alten nicht wieder. Und somit schaufelst du dir deinen eigenen Adressraum zu. Zu dem ist das ganze Rumkopieren im Speicher auch nicht sehr performant. Deswegen vorher abschätzen wie viel Speicher benötigt wird und wenn man mehr bracuht nicht jeden mal um ein element das Array vergrößern, sondern gleich um 20% bis 30% der alten Größe.
ChrisWF Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 17.03.06 14:49 
Vielen Dank!

Dann lauf ich am besten die Datei vorher schon mal durch und speichere die Zeilenzahl.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.03.06 14:54 
Und warum wird hier schon wieder in fünf Foren gleichzeitig gepostet?

www.delphipraxis.net...st518052.html#518052
ChrisWF Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 17.03.06 15:02 
user profile iconLuckie hat folgendes geschrieben:
Und warum wird hier schon wieder in fünf Foren gleichzeitig gepostet?

www.delphipraxis.net...st518052.html#518052


Könnte ich dich auch fragen *thumbs up*
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 17.03.06 15:09 
user profile iconChrisWF hat folgendes geschrieben:
user profile iconLuckie hat folgendes geschrieben:
Und warum wird hier schon wieder in fünf Foren gleichzeitig gepostet?

www.delphipraxis.net...st518052.html#518052


Könnte ich dich auch fragen *thumbs up*

Nein, ich habe deine Pflicht übernommen und die Beiträge verlinkt, oder woher soll jemand der hier liest, wissen, dass im anderen Forum eine Lösung gepostet wurde, wenn du die Beiträge nicht verlinks, wenn du schon Crosspostings über diverse Foren vertreust?
ChrisWF Threadstarter
Hält's aus hier
Beiträge: 6



BeitragVerfasst: Fr 17.03.06 15:47 
Auch beim Delphiforum entschuldige ich mich und werde in Zukunft immer brav verlinken !!!