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
GetMemory oder
VirtualAlloc, 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).
* *
THandleStream +
CreateFile, 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