![]() |
Textdatei laden - Integerüberlauf
Hallo,
ich versuche mit einer StringList eine relativ große Text-Datei (1*265*819*892 Bytes) zu laden und bekomme den Fehler "Integerüberlauf". Compiliert unter Win64 mit Delphi 10.2 Tokyo. gibt es da eine Lösung für das Problem? lg Klaus |
AW: Textdatei laden - Integerüberlauf
Wie sieht dein Code aus? Ohne ist das alles nur Glaskugelgucken.
Grüße Dalai |
AW: Textdatei laden - Integerüberlauf
Der Code sieht ungefähr so aus:
Delphi-Quellcode:
var StrList : TStringList; StrList := TStringList.Create; try StrList.LoadFromFile(LogFileName); // .. // .. except on E: Exception do begin Info.Add(FormatLang('Fehler beim Öffnen der Datei: %s (%s)',[LogFileName,E.Message])); // --> Integerüberlauf end; end; |
AW: Textdatei laden - Integerüberlauf
Hallo,
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. Ich hatte mir damals eine TLargeStringList gebaut, die intern aus einzelnen StringListen bestand. Grenze war dann trotzdem bei 1,5 GB Arbeitsspeicher (32-Bit-Delphi). |
AW: Textdatei laden - Integerüberlauf
Die Frage ist ja, was du mit dieser riesigen Datei anstellst. Ist es nötig, die komplett in den Speicher zu laden? Oder könntest du sie auch zeilenweise durchgehen und dafür z.B. einen
![]() Edit: Ach so, noch vergessen: ich vermute, dass der Fehler vielleicht auch gar nicht direkt in dem LoadFromFile bei dir auftritt, sondern in dem Code dazwischen, den du jetzt hier nicht gezeigt hast, weil du mit einem Integer durch die Zeilen oder Zeichen der StringList gehst oder irgendwas berechnest? Schau doch mal mit dem Debugger, wo der Fehler tatsächlich passiert. Das LoadFromFile selbst würde dir nämlich eher einen vollen Speicher melden, keinen Integerüberlauf (so meine Erfahrung mit zu großen Dateien). |
AW: Textdatei laden - Integerüberlauf
Zitat:
Grüße Dalai |
AW: Textdatei laden - Integerüberlauf
Zitat:
Du solltest also wirklich mal den Debugger einsetzen. Zitat:
Delphi-Quellcode:
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.
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; Allerdings sehe ich in diesem konkreten Fall erstmal keine dieser Grenzen überschritten. |
AW: Textdatei laden - Integerüberlauf
Ich denke auch, dass es nicht möglich ist via TStringlist eine so große Dateien zu laden.
Wenn mann sich die Procedure in System.Classes ansieht dann ist beim Integer Schluss mit lustig.
Delphi-Quellcode:
Am Code dazwischen liegt es definitiv nicht.
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; ich werde das ganze umbauen und versuchen mit TStreamReader zu realisieren. Danke für euer bemühen, ich werde hier posten, wie ich es gelöst habe. lg Klaus |
AW: Textdatei laden - Integerüberlauf
Habe das ganze mit TStreamReader gelöst.
Ich durchsuche viele Logfiles mit unterschiedlicher Dateigröße. Wenn die Datei >= 1073741824 Bytes ist verwende ich den TStreamReader, ansonsten die TStringList, welche wesentlich schneller ist. hier mein Codeausschnitt
Delphi-Quellcode:
var StreamReader : TStreamReader; sLine : string; iLine : integer; begin try StreamReader := TStreamReader.Create(LogFileName); iLine := 0; while not StreamReader.EndOfStream do begin Inc(iLine); sLine := StreamReader.ReadLine; // .. // .. // .. end; finally FreeAndNil(StreamReader); end; end; |
AW: Textdatei laden - Integerüberlauf
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz