Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

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

AW: RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 20:29
Erstmal darfst du vergessen, was im Windows an RAM frei ist.
Das hat nichts damit zu tun, was im Programm verfügbar ist oder nicht.
Es ist schon sehr viele Jahrzehnte her, als sich Programme den RAM "direkt" teilten. (zum Glück)

Selbst wenn RAM und PageFile randvoll sind (physischer Speicher voll), sieht man im Programm noch viel freien virtuellen Speicher.
Oder auch wenn im Windows viel frei sein mag, kann im Programm alles voll sein.

Win32-Programme haben standardmäßig nur 2 GB zur Verfügung.


Kann man Windows dazu bewegen, belegten Speicher auf den Datenträger auszulagern?
Ja, aber wer sowas absichtlich macht, gehört standrechlich erschossen ausgepeitscht ... inkl. der Idioten welche sogenante "Speicheroptimierer" programmiert haben.

Außerdem ist es für doch vollkommen nutlos.
Speicherkomprimierung, sowie ausgelagerter Speicher geben nur physischen Speicher "frei",
aber im virtuellen Speicher bleibt es dort, wo es ist, also dein Programm sieht keinen Unterschied.

https://www.delphipraxis.net/213454-...exception.html

Ja, man könnte die freien RAM- Speicherblöcke suchen,
aber einfacher ist es via Delphi-Referenz durchsuchenGetMemory oder Bei Google suchenVirtualAlloc, welche ein NIL liefern.
Delphi-Quellcode:
var
  P: Pointer;
begin
  //GetMem(P, 2000000000); // Exception
  //P := AllocMem(2000000000); // Exception
  P := GetMemory(2000000000); // nil
  if not Assigned(P) then
    RaiseLastOSError;
end;


* Man kann von Win32 Programmen die 2 GB auf 4 GB (im 64 Bit-Windows, bzw. 3 GB in einem 32 Bit-Windows) erweitzern -> LargeAddressAware.
* Man kann mit 64 Bit kompilieren.
* Man kann externen Speicher reservieren und dynamisch im Programm mappen. (umschalten)
* * MMF / MemoryMappedFiles ohne Datei (nur im RAM und/oder PageFile)
* * MMF / MemoryMappedFiles mit einer Datei
* * AWE / Address Windowing Extensions
* * ...
* Oder ganz einfach einen TFileStream benutzen. Beim Zugriff cached Windows standardmäßig Dateien im RAM und wenn es voll ist, wird in die Datei ausgelagert. (es ist für dich quasi eqal, ob Auslagerungsdatei oder eine echte Datei).
* * Delphi-Referenz durchsuchenTHandleStream + Bei Google suchenCreateFile, da kannst noch bissl optimieren und die "Datei" als "Cache" definieren, durch Windows angeblich das Caching noch bissl optimiert (sie also vorrangig im RAM hält)




Optimierung für Cache:
FILE_ATTRIBUTE_TEMPORARY
FILE_FLAG_RANDOM_ACCESS oder FILE_FLAG_SEQUENTIAL_SCAN (jenachdem)

Optional:
FILE_FLAG_DELETE_ON_CLOSE + TPath.GetTempFileName
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (15. Aug 2023 um 20:46 Uhr)
  Mit Zitat antworten Zitat