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
Benutzerbild von himitsu
himitsu

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

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
Ein Therapeut entspricht 1024 Gigapeut.

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 05:47 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz