Für alle die die Bedeutung der Suchfunktion kennen...
Die Lösung zu meinem Problem ist relativ einfach gewesen.
setlength(Daten, length(Daten)+1);
Dient dazu ein Array um eins zu vergrößern. Das funktioniert auch wunderbar. Wenn man allerdings das ganze Array so aufbaut - immer um einen vergrößern - und das Array dann echt groß wird, kann dabei der Speicher knapp werden.
Ich erklähre mir das so: Vermutlich muss so ein Array in einem zusammenhängendem Stück Speicher geschrieben werden. Wenn also ein Feld des Arrays 10k groß ist und wir drei Felder haben, so belegt das Array 30k. Wenn nun dieser Block nicht erweitert werden kann auf 40k so wird ein neuer Block im Speicher gesucht, der die 40k aufnehmen kann. Scheinbar wird der alte 30k große Block dabei aber nicht oder nicht sofort freigegeben, so dass wir nun schon 70k Speicher belegen mit Daten, die es überhaupt nicht gibt.
Es ist nur eine vermutung, die sich auf folgenden versuch stützt:
Delphi-Quellcode:
test:='0123456789';
for i:=0 to 10000 do
begin
setlength(Daten, length(Daten)+1);
for j:=0 to 10 do
begin
setlength(Daten[i], length(Daten[i])+1);
Daten[i][j]:=test;
end;
end;
Diesen Code habe ich aus dem Gedächtnis getippt - könnte sein, dass er Fehlerbehaftet ist aber sinngemäß stimmt er
Wer nun meint, Das Array müsse 1.000.000 Byte groß sein, der irrt. Zumindest nach meiner oben beschriebenen Messmethode.
Fakt ist, es war nicht möglich ein oben beschriebenes Array zu verarbeiten.
Die Lösung war darum recht simpel. Ich habe - relativ aufwendig - die Anzahl der zu erwartenden Datensätze ermittelt und das array gleich in diesen Dimensionen gestaltet. Danach stimmte der Speicherverbrauch mit der (geschätzten) Datengröße weitgehend überein.
Meine Vermutungen basieren auf Beiträge aus der DP, die ich perönlich für Einleuchtend halte. Mag sein, dass dies ein bekanntes Problem ist. Ich habe mir das jedenfalls selbst erarbeitet 8)
MfG
Tonic
Der frühe Vogel fängt den Wurm, richtig.
Aber wird nicht auch der frühe Wurm vom Vogel gefressen?