AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein RAM Speicher freimachen und aneignen
Thema durchsuchen
Ansicht
Themen-Optionen

RAM Speicher freimachen und aneignen

Ein Thema von mwilms · begonnen am 15. Aug 2023 · letzter Beitrag vom 15. Aug 2023
Antwort Antwort
mwilms

Registriert seit: 23. Nov 2022
Ort: Wolfratshausen
40 Beiträge
 
Delphi 12 Athens
 
#1

RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 15:37
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
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#2

AW: RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 16:23
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (15. Aug 2023 um 16:30 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 16:44
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.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

AW: RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 16:48
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)
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: RAM Speicher freimachen und aneignen

  Alt 15. Aug 2023, 21: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
$2B or not $2B

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

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:54 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