![]() |
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 |
AW: RAM Speicher freimachen und aneignen
Memory Mapped Files.
Du lädst große Dateien einfach nicht komplett in den Speicher ![]() 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) |
AW: RAM Speicher freimachen und aneignen
Ich habe dafür auch mal etwas geschrieben:
![]() Und Flamefire hat dazu auch eine Stream-Implementierung geschrieben: ![]() 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. |
AW: RAM Speicher freimachen und aneignen
Wenn wir dabei sind habe ich da auch was gemacht:
![]() Möglicherweise ist der Code von jaenicke aber der schnellere/einfachere Weg (Nur anhand der Überschrift, hab den Code von ihm nicht gesehn) |
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:
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. ![]() Ja, man könnte die freien RAM- Speicherblöcke suchen, aber einfacher ist es via ![]() ![]()
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). * * ![]() ![]() 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 12:57 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-2025 by Thomas Breitkreuz