Einzelnen Beitrag anzeigen

Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.024 Beiträge
 
Delphi 12 Athens
 
#7

AW: Textdatei laden - Integerüberlauf

  Alt 15. Jul 2020, 08:25
ich versuche mit einer StringList eine relativ große Text-Datei (1*265*819*892 Bytes) zu laden
Das sind ja auch nur gut 180 MB, sollte also kein Problem sein.

Du solltest also wirklich mal den Debugger einsetzen.


die TStringList hat eine Grenze von theoretisch 2 Mrd. Einträgen.
Praktisch ist aber schon viel früher Schluss.
Auch damals unter Delphi-64Bit ging es bei mir nicht weiter.
Das LoadFromString/LoadFromStream ist in der Regel für die Begrenzung zuständig.
Delphi-Quellcode:
procedure TStrings.LoadFromStream(Stream: TStream; Encoding: TEncoding);
var
  Size: Integer;
  Buffer: TBytes;
begin
  BeginUpdate;
  try
    Size := Stream.Size - Stream.Position;
    SetLength(Buffer, Size);
    Stream.Read(Buffer, 0, Size);
    Size := TEncoding.GetBufferEncoding(Buffer, Encoding, FDefaultEncoding);
    SetEncoding(Encoding); // Keep Encoding in case the stream is saved
    SetTextStr(Encoding.GetString(Buffer, Size, Length(Buffer) - Size));
  finally
    EndUpdate;
  end;
end;
Obwohl Stream.Size und Stream.Position als Int64 deklariert sind, wird für die Differenz nur ein Integer bereitgestellt. Das nachfolgende SetLength muss dann noch einen zusammenhängenden Speicherbereich in der gewünschten Größe finden, was unter 32-Bit schnell mal zum problem werden kann. Aber auch dieses SetLength beschränkt die Puffergröße auf 2GB, weil NewLength auch nur ein Integer ist.

Allerdings sehe ich in diesem konkreten Fall erstmal keine dieser Grenzen überschritten.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat