![]() |
AW: Delphi und 64-Bit Programme
Wer ne 32GB Datei in eine TStringList läd, hat ganz andere Probleme als den Fakt, dass es bei mehr als (2^31)-1 Zeilen kracht.
Zitat:
Wer sich mal die Mühe gemacht hat, in den Code von TStringList zu schauen, der wird gesehen haben, dass pro Eintrag 8 bzw 16 byte benötigt werden (TStringItemList). D.h. dass selbst beim Eintragen von Leerstrings in eine TStringList bei einer non LAA Anwendung gerade mal Speicher für ca 268mio Einträge zur Verfügung steht. Anders herum betrachtet heißt das, dass eine TStringList mit einer Capacity von MaxInt als 64bit Anwendung schon allein ca 32GB verbrauchen würde (MaxInt*16)! Und da sind noch gar keine Strings drin. Mal kurz durchgerechnet, welche Mindestzeilenlänge die Datei haben müsste, wenn sie in UTF8 kodiert wäre und nur ASCII Chars enthalten würde - das wären 32GB Zeichen. Eine TStringList hat maximal Platz für 2^31-1 Einträge. Somit müssten die Zeilen im Durchschnitt 16 Zeichen lang sein, das kommt mir doch schon sehr kurz vor für eine Datei, die man mit einer TStringList verarbeiten möchte. Ich stand kürzlich selbst vor der Entscheidung, ob ich bei den Spring Collections auf NativeInt für Index umstellen soll oder nicht, aber da kommt man dann doch auf ganz andere Probleme, wie den Fakt, dass ein open Array auch unter 64bit seinen versteckten High Parameter nur als Int32 übergibt. P.S. Ist auch schon eine ganze Weile lang "bekannt" (vermutlich inzwischen schon wieder vergessen worden, ist halt nicht einfach bei zig Tausend Issues in nem JIRA den Überblick zu behalten, woll) ![]() |
AW: Delphi und 64-Bit Programme
Zitat:
|
AW: Delphi und 64-Bit Programme
Zitat:
Zitat:
Trotzdem gibt es Fälle in der Bildverarbeitung wo es mal eng werden kann. Erst recht mit 32Bit Programmen. Daher lebt mein einziges 64Bit Programm unter Lazarus, da geht 64Bit schon ein bisschen länger und nicht erst seit die CE das auch erlaubt. |
AW: Delphi und 64-Bit Programme
Zitat:
Delphi-Quellcode:
procedure Foo(const values: array of Integer);
begin Writeln(High(values)); end; begin Foo([]); end. |
AW: Delphi und 64-Bit Programme
Zitat:
|
AW: Delphi und 64-Bit Programme
So ging es mir auch, ja. Ich hatte ja schon einen Blick riskiert...
|
AW: Delphi und 64-Bit Programme
TStrings.LoadFromStream stört mich auch, weil dies beim Entpacken von ZIP-Dateien schon mal blöd ist.
Aber bei großen Dateien wird wahrscheinlich eh das folgende performanter sein (im ms (MemoryStream) liegt eine entpackte ZIP-Datei), weil ich theoretisch auch stückweise mit dem Ergebnis arbeiten kann:
Code:
Result:=TStringList.Create(true);
Result.BeginUpdate; reader:=TStreamReader.Create(ms); while (not reader.EndOfStream) do Result.Add(reader.ReadLine()); Result.EndUpdate; Reader.Free; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:42 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-2025 by Thomas Breitkreuz