Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetMem mit Delphi 2010 unter Windows 8

  Alt 17. Sep 2014, 14:59
Weil dein Programm nunmal nur 2 GB an virtuellem RAM zur Verfügung hat.
Dann liegen in dem Speicher "verteilt" bereits die EXE, DLLs und die sonstigen reservierten Speicherblöcke usw.

Und nun versuch mal in diese "fragmentierten" 2 GB noch einen "zusammenhängenden" 1 GB-Block zu finden.


Nach meiner Erfahrung wird es ab 500 MB immer schwerer etwas zu finden und wenn kein zusammenhängender Block mehr existiert, welcher mindestens die 1 GB aufnehmen kann, dann knallt es eben.
Im Extremfall reichen nur 2x je 1 Byte gut verteilt, um deinen 1 GB-Block im verfügbaren 2 GB-Bereich zu blockieren.


Lösungen:
* Überlegen ob man überhaupt 1 GB an Arbeitspeicher benötigt und versuchen mit weniger auszukommen
* Aufteilen -> mehrere kleinere Blöcke, die zusammen 1 GB beinhalten
* Auslagern -> z.B. MMF (MemoryMappedFiles), wovon nur ein aktuell benötigter kleiner Teil in deinen virtuellen RAM gemappt wird. (und der Rest kann entweder in einer Datei oder im physischen RAM rumliegen)
* Ein 64-Bit-Programm schreiben ... das hat einen größeren virtuellen RAM, womit die Fragmentierung nicht so schnell zum Problem wird.
* ...
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (17. Sep 2014 um 15:17 Uhr)
  Mit Zitat antworten Zitat