AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Delphi und 64-Bit Programme

Ein Thema von Harry Stahl · begonnen am 25. Mär 2022 · letzter Beitrag vom 30. Mär 2022
Antwort Antwort
Seite 4 von 4   « Erste     234   
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#31

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 15:32
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.

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
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight

Geändert von Stevie (30. Mär 2022 um 18:41 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#32

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 18:12
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#33

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 18:45
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.

..., 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.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#34

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 18:49
Int32 oder Cardinal?
Rate doch mal

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

begin
  Foo([]);
end.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.027 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#35

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 19:00
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 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.
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#36

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 19:39
So ging es mir auch, ja. Ich hatte ja schon einen Blick riskiert...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
philipp.hofmann

Registriert seit: 21. Mär 2012
Ort: Hannover
898 Beiträge
 
Delphi 10.4 Sydney
 
#37

AW: Delphi und 64-Bit Programme

  Alt 30. Mär 2022, 20:18
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;
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:23 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz