Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Textdatei laden - Integerüberlauf (https://www.delphipraxis.net/204925-textdatei-laden-integerueberlauf.html)

Dalai 15. Jul 2020 10:41

AW: Textdatei laden - Integerüberlauf
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1469611)
Zitat:

Zitat von KWin (Beitrag 1469572)
ich versuche mit einer StringList eine relativ große Text-Datei (1*265*819*892 Bytes) zu laden

1*256*819*892 = 187.020.288

[Korinthe] 1*265*819*892 Bytes = 193.595.220 Bytes [/Korinthe] Ändert aber natürlich nichts an der Größenordnung. Wichtige Teile des Codes fehlen, daher ist eine Beurteilung nicht sinnvoll möglich, woran es genau klemmt.

Grüße
Dalai

Jasocul 15. Jul 2020 10:46

AW: Textdatei laden - Integerüberlauf
 
Ich vermute, dass 1*265*819*892 Bytes eigentlich 1.265.819.892 Bytes heißen soll und der * nur der Verdeutlichung dienen sollte.

KWin 15. Jul 2020 10:50

AW: Textdatei laden - Integerüberlauf
 
Ich habe es ausprobiert,
wenn die Datei > wie MaxInteger/2 ist (1073741824) dann tritt bei StringList.LoadfromFile
der Fehler Integerüberlauf auf. Ich vermute mal, dass Delphi für jedes Character 2 Bytes benötig.

Sherlock 15. Jul 2020 11:08

AW: Textdatei laden - Integerüberlauf
 
Zitat:

Zitat von KWin (Beitrag 1469618)
Ich vermute mal, dass Delphi für jedes Character 2 Bytes benötig.

Je nach Encoding gerne auch mal vier Byte. Das liegt aber nicht an Delphi: https://de.wikipedia.org/wiki/UTF-8#Allgemeines

Sherlock

himitsu 15. Jul 2020 14:35

AW: Textdatei laden - Integerüberlauf
 
Die Datei wird ja quasi mehrfach in den Speicher geladen
* erstmal in einem Puffer
* dann nochmal als Unicode umkopiert
* und zum Schluss nochmal jede Zeile als einzelner String

Die ersten Beiden Zeile sind ein Block und müssen demach auch in einen "goßen" freien Speicherblock
und erfahrungsgemäß wird es ab 700 MB oft nahezu unmöglich im fragmentieren Speicher noch was zu finden.

Lösung: mit 64 Bit kompilieren

Oder Zeilenweise einlesen, entweder über eine passende Streamingfunktion oder mit den alten AssignFile+ReadLn,
aber selbst das wird nicht gehen, denn die Strings sind zwar kurze Zeilen-Stückchen,
die sich im Speicher gut verteilen, aber Dank Unicode sind es dann über 2 GB,
womit du dann die 4GB-Option aktivieren
Delphi-Quellcode:
{$SetPEFlags IMAGE_FILE_LARGE_ADDRESS_AWARE}
,
so dass du dann bis fast 4 GB (64 Bit Windows), bzw. 3 GB (32 Bit Windows) zur Verfügung hasthättest. (abzüglich geladener EXE, DLLs usw.)




Das "richtige" Verfahren ist aber nicht ALLEs zu laden, sondern solche großen Dateien nur stückchenweise in mehreren Blöcke á einigen KB/MB aufgeteilt zu laden und nacheinander zu behandeln.

haentschman 15. Jul 2020 14:42

AW: Textdatei laden - Integerüberlauf
 
Zitat:

Lösung: mit 64 Bit kompilieren
Zitat:

TE: Compiliert unter Win64 mit Delphi 10.2 Tokyo.
...wer lesen kann ist klar im Vorteil. :zwinker:

Andreas13 15. Jul 2020 15:00

AW: Textdatei laden - Integerüberlauf
 
Zitat:

Zitat von haentschman (Beitrag 1469646)
Zitat:

Lösung: mit 64 Bit kompilieren
Zitat:

TE: Compiliert unter Win64 mit Delphi 10.2 Tokyo.
...wer lesen kann ist klar im Vorteil. :zwinker:

Ich habe den TE so verstanden, daß er zwar 64-Bit-Windows verwendet, aber nicht die Delphi-Zielplattform 64-Bit benutzt hat.
Gruß, Andreas

KWin 15. Jul 2020 15:58

AW: Textdatei laden - Integerüberlauf
 
Hallo,

ich verwende 64-Bit-Windows und die Delphi-Zielplattform 64-Bit.

himitsu 15. Jul 2020 17:55

AW: Textdatei laden - Integerüberlauf
 
Wieviele Zeilen hatt denn die Datei?

[EDIT]
Obwohl, selbst mit 32 Bit sind ja theoretisch schon knapp 'ne milliarde Zeilen möglich
und selbst wenn im 64 Bit noch ein Zähler auf 32 Bit stehen würde, wären es immernoch mindestens 500 Mio.

Uwe Raabe 15. Jul 2020 18:53

AW: Textdatei laden - Integerüberlauf
 
Mit LoadFromFile ist die Größe der Datei intern auf 2GB beschränkt, unabhängig von den Zeilen und von 32/64-Bit.

Ein alternative Ansatz dazu wäre über einen StreamReader die Datei zeilenweise zu lesen und jede Zeile mit Add anzufügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:29 Uhr.
Seite 2 von 4     12 34      

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