Er ist wohl der Meinung, dass eine StringListe für so große Dateien nicht geeignet wäre.
Vielleicht stimmt das ja auch:
Eben hatte ich einen Testdurchlauf gestartet mit einer ca. 285 MB großen
Textdatei. Beim Versuch, diese Datei (nicht Zip einlesen, sondern vorher entpacken) direkt in eine Stringliste einzulesen, erhalte ich nach kurzer Zeit die Meldung, ich hätte zu wenig Arbeitsspeicher:
Exception der Klasse EOutOfMemory mit der Meldung 'Zu wenig Arbeitsspeicher' aufgetreten.
In meinem Rechner sind 4 GB
Ram verbaut. Geöffnet sind ein Dateimanager, Seamonkey, Thunderbird und RadStudio 2009 nebst im Debug-Mode laufender Exe. Das kann's doch nicht sein
Delphi-Quellcode:
procedure TForm1.Button_TextClick(Sender: TObject);
Var
Liste : TStrings;
begin
IF NOT OpenDlg.Execute THEN Exit;
Liste := TStringList.Create;
Try
Liste.LoadFromFile(OpenDlg.FileName);
Finally
Liste.Free;
End;
end;
Lese ich dagegen die Textdatei via ReadLn ein und weise dabei jedesmal der Stringliste die eingelesene Zeile zu, komme ich auf 7.654.474 Zeilen, die sich am Ende in der Stringliste befinden. Das verstehe ich nicht: Beim direkten Einlesen ist der Speicher angeblich zu klein, beim Zuweisen über ReadLn paßt's dann wieder rein ...
Delphi-Quellcode:
procedure TForm1.Button_TextClick(Sender: TObject);
Var
Liste : TStrings;
f : TextFile;
Zeile : String;
begin
IF NOT OpenDlg.Execute THEN Exit;
Liste := TStringList.Create;
AssignFile(f,OpenDlg.FileName);
Reset(f);
Try
WHILE NOT EOF(f) DO
BEGIN
ReadLn(f,Zeile);
Liste.Append(Zeile);
Label_Anzahl.Caption := IntToStr(Liste.Count);
Application.ProcessMessages;
END;
Finally
Liste.Free;
CloseFile(f);
Label_Anzahl.Caption := Label_Anzahl.Caption + ' ' + Zeile;
End;
end;
Es erfolgt keine Fehlermeldung, alle Zeilen der Datei wurden in die Stringliste übertragen. Wie kann es also sein, daß beim direkten Befüllen der Stringliste eine Meldung erscheint, der Arbeitsspeicher würde nicht ausreichen?
Eben erhalte ich die Mitteilung, daß die erste Procedure mit Liste.LoadFromFile, wenn sie mit XE2 kompiliert wurde, fehlerfrei arbeitet.