Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   RAM Speicher freimachen und aneignen (https://www.delphipraxis.net/213545-ram-speicher-freimachen-und-aneignen.html)

mwilms 15. Aug 2023 14:37

RAM Speicher freimachen und aneignen
 
Hallo,

kann man herausfinden, wieviel Speicherplatz für einen TMemoryStream zur Verfügung steht, ohne eine Exception zu generieren? Kann man den freien Speicherblock erweitern?

Ich habe den Eindruck, dass der RAM Speicher ziemlich zerstückelt ist. Windows müsste doch in der Lage sein, freien Speicherplatz zusammenzulegen, über eine vom Prozessor unterstützte logische Adressierung von Pages des RAM Speichers (Page-Table?).

Kann man Windows dazu bewegen, belegten Speicher auf den Datenträger auszulagern?

Wie machen sich z.B. Videoprogramme mit großem Speicherbedarf freien Speicherplatz zu eigen?

Vielen Dank

mwilms

Neutral General 15. Aug 2023 15:23

AW: RAM Speicher freimachen und aneignen
 
Memory Mapped Files.
Du lädst große Dateien einfach nicht komplett in den Speicher

https://learn.microsoft.com/en-us/wi...y/file-mapping

Die Zerstückelung hängt normalerweise eher mit dem Heap zusammen als mit dem Paging.
Sehr große (riesige) zusammenhängende Speicherblöcke kannst du quasi knicken.
Und in den meisten Fällen ist das auch nicht notwendig (siehe Memory Mapped Files)

jaenicke 15. Aug 2023 15:44

AW: RAM Speicher freimachen und aneignen
 
Ich habe dafür auch mal etwas geschrieben:
https://www.delphipraxis.net/151898-...ei-reader.html

Und Flamefire hat dazu auch eine Stream-Implementierung geschrieben:
https://entwickler-ecke.de/viewtopic.php?t=100088

Das war für das schnelle Lesen von physischen Dateien gedacht, aber man kann auch rein virtuelle MMFs so verwenden. Den Quelltext müsstest du dafür leicht anpassen. Dafür muss an CreateFileMapping statt eines Dateihandles INVALID_HANDLE_VALUE übergeben werden.

Neutral General 15. Aug 2023 15:48

AW: RAM Speicher freimachen und aneignen
 
Wenn wir dabei sind habe ich da auch was gemacht:

https://www.delphipraxis.net/113289-mapped-streams.html

Möglicherweise ist der Code von jaenicke aber der schnellere/einfachere Weg (Nur anhand der Überschrift, hab den Code von ihm nicht gesehn)

himitsu 15. Aug 2023 20:29

AW: RAM Speicher freimachen und aneignen
 
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.


Zitat:

Zitat von mwilms (Beitrag 1525631)
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz