Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi und 64-Bit Programme (https://www.delphipraxis.net/210261-delphi-und-64-bit-programme.html)

Stevie 30. Mär 2022 14:32

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:

Zitat von hoika (Beitrag 1504058)
Ein TStringList sollte unter 64Bit mehr Daten verwalten können als unter 32Bit.

Tut sie auch - eine 32bit Anwendung kann ohne large address aware 2GB Speicher verwalten, mit 3GB (32bit OS) bzw 4GB (64bit OS).

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)
https://quality.embarcadero.com/browse/RSP-12438

jaenicke 30. Mär 2022 17:12

AW: Delphi und 64-Bit Programme
 
Zitat:

Zitat von Stevie (Beitrag 1504115)
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.

Ist nun im Hinterkopf gespeichert, gut zu wissen. :)

Sinspin 30. Mär 2022 17:45

AW: Delphi und 64-Bit Programme
 
Zitat:

Zitat von Stevie (Beitrag 1504115)
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.

Ist ja alles hier auch nur theoretisch. Ich denke auch das man da an anderer Stelle schon was falsch gemacht hat wenn es soweit kommt.

Zitat:

Zitat von Stevie (Beitrag 1504115)
..., wie den Fakt, dass ein open Array auch unter 64bit seinen versteckten High Parameter nur als Int32 übergibt.

Int32 oder Cardinal? Selbst mit Int32 hat man schon ein bisschen Platz um was zu speichern.

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.

Stevie 30. Mär 2022 17:49

AW: Delphi und 64-Bit Programme
 
Zitat:

Zitat von Sinspin (Beitrag 1504127)
Int32 oder Cardinal?

Rate doch mal

Delphi-Quellcode:
procedure Foo(const values: array of Integer);
begin
  Writeln(High(values));
end;

begin
  Foo([]);
end.

Stevie 30. Mär 2022 18:00

AW: Delphi und 64-Bit Programme
 
Zitat:

Zitat von Harry Stahl (Beitrag 1503932)
Habe dann mal spaßeshalber unter Windows als 64-bit-Programm versucht eine ca. 2 GB csv-Textdatei in eine Stringlist zu laden (die "star2002-full.csv" Datei von dieser Quelle: https://sdm.lbl.gov/fastbit/data/samples.html) . Das scheitert aber schon alleine daran, dass Delphi einen Integerüberlauf in der Procedure TStrings.LoadFromstream meldet.

Hab gerade mal in die Methode geschaut und mir ist ein bisschen :kotz: geworden. Es wird also ein buffer in der Größe des noch zu lesenden Streams erzeugt (2GB alloc). Dann wird über TEncoding ein string daraus generiert - je nach encoding des Streams also nochmal 2-4GB und der wird dann durch SetTextStr geprügelt, wo er anhand der LineBreak Eigenschaft zerpfückt wird - ein Meisterstück an Softwaredesign. :lol:

jaenicke 30. Mär 2022 18:39

AW: Delphi und 64-Bit Programme
 
So ging es mir auch, ja. Ich hatte ja schon einen Blick riskiert...

philipp.hofmann 30. Mär 2022 19:18

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.
Seite 4 von 4   « Erste     234   

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