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
{$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.