![]() |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
Im Gegensatz, für das Gesamtsystem machen solche "RAM-Optimierer" das Schlimmste, was nur geht. Es wird Alles ausgelagert und anschließend muß überall wieder der aktuell genutzte Speicher wieder zurück, was somit alle Programme ausbremst. Für sowas wäre es schöner, wenn Windows eine bessere Unterstützung zur Steuerung der FileCache bietet, denn das Einzige was dieser Optimierer erreicht ist das leeren dieser Cache (der Prozessspeicher wird ja sowieso wieder zurückgeladen, sobald darauf zugegriffen wird) Wenn neuer Speicher in dem vollen physischen RAM nötig wird, dann lagert Windows schon von selber Speicher aus. (leider wird entgegen der möglichen Einstellung "Prozessspeicher zu bevorzugen" von Windows der FileCache bevorzugt, was bei großen Lese-/Schreib-/Kopieraktionen die Programme aus dem RAM verdrängt und Windows sie erst wieder laden muß, wenn sie auf ihren Speicher zugreifen wollen) Aber das Ändert rein garnichts an dem Problem mit seinem fragmentierten virtuellen Speicher. Ein PageError, weil ein Speicherblock (Page) grade nicht im RAM war, dass bekommt sein Programm garnicht mit. Es wird nur ein bisschen langsamer, aber an der Größe und Belegung seines virtuellen Speichers ändert sich nichts ... da wo die Page eingebungen ist, da bleibt sie auch. Es darf sich auch garnichts verschieben, da sonst alle Pointer ein Problem hätten, die darauf zeigen. Darum auch die Trennung zwischen Virtuellem und Physischen Speicher, damit Windows dort den realen Speicher verschieben kann wie es will, ohne dass das Programm es zu interessieren hat. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
|
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Danke an alle für Eure rege Teilnahme an meinem Problem!
Was warum auch immer mit dem TBitmap bei mir zur genannten Fehlermeldung führt kann ich nicht ergründen, denn selbst wenn die Fehlermeldung nicht kommt habe ich laut Task Manager nur 265 MiB Speicher belegt. Die Anforderungen an mein "großes Bitmap" sind hingegen bekannt und zu meinem Glück brauche ich nur das: 'Pixel ist gezeichnet oder nicht gezeichnet'. Deshalb habe ich jetzt mit
Code:
einfach ein schwarz / weiß Bitmap erstellen lassen -> Fehler ist weg und damit auch mein Problem. (Der Befehl muß vor der Zuweisung von Height and Width eingefügt werden.)
Bitmap->PixelFormat = pf1bit;
|
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
Wenn du in 2 GB Prozessspeicher alle 200 MB je 1 Byte speicherst, dann hast du 10 Byte belegt. OK, eigentlich 41 KB, da Windows den Speicher in 4 KB-Blöcken vewaltet. Obwohl also nur 41 KB belegt sind, hast du dennoch keine Chance dort einen freigen zusammenhängenden Block mit 300 MB zu finden. Belegt und Verwendet ist auch ein Unterschied. Du kannst 400 MB Speicher reservieren, aber wenn dort nicht reingeschrieben wurde (alles mit Nullen gefüllt), dann ist dieser Speicher nicht belegt. Wie ebenfalls schon genannt wurde, hat der Taskmanager unterschiedliche Anzeigen für "belegten" Speicher. (es gibt noch viel mehr Spalten, die man sich da anzeigen lassen kann) |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
Zum Task Manager (Windows 7): Der Wert von 265 MiB stammt vom Reiter 'Processes', Spalte 'Memory (Private Working Set)'. Eine andere Stelle kenne ich nicht, auch nicht Optionen um das zu ändern. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
|
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Alter Taskmanager (Win XP/7) im Menü Ansicht
und beim Neuen Windows 8/10 im Kontextmenü der Gridspalten. Zitat:
Werden die anderen Forms erst danach erstellt, dann verteilen sie ihren Speicher auch nicht vorher und sorgen so eventuell für ein Belegen des großen Speicherblocks. Nachher passen aber deren viele kleinen Speicherblöcke in die verbliebenen Lücken. ABER, dass bedeutet nicht, dass vorher nicht schon durch was Anderes der Speicher schon zu sehr fragentiert sein kann. z.B. neue DLLs in neueren Windowsen und dann bringen auch Zusatzprogramme, wie z.B. Drucker-, Monitor-Treiber, TeamViewer, Skype usw. ihre DLLs in alle fremden Prozesse, also auch in deine Anwendung und schwupps, schon kann es plötzlich wieder nicht mehr funktionieren, egal ob deine Forms danach sind, weil schon viele Anderes unvorhersehbar vorher abläuft. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
|
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Es geht ja nicht darum, wieviel Speicher insgesamt zur Verfügung steht, sondern wieviel Speicher an einem Stück zur Verfügung steht. Wenn du zwar 2 Gb frei hast, aber alle 20 MB mal ein paar Byte stehen, bekommst du nie 300 MB am Stück unter. Da kannst du dich drehen und wenden soviel du willst. Dass es jetzt vielleicht funktioniert, heisst noch lange nicht, dass es dauerhaft funktioniert. Einmal Neustarten, 3-4 Programme starten und schon sieht die Speicherfragmentierung wieder ganz anders aus.
|
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Es wurde ja bereits verkündet das meine Idee mit Speicher füllen falsch sei, ich habe es so getestet:
Delphi-Code:
Code:
Könnte mir bitte jemand sagen was daran falsch sei damit ich es endlich Verstehe?
procedure MyTrimWorkingSet;
var hProcess: THandle; begin hProcess := OpenProcess(PROCESS_SET_QUOTA, false, GetCurrentProcessId); try SetProcessWorkingSetSize(hProcess, $FFFFFFFF, $FFFFFFFF); finally CloseHandle(hProcess); end; end; Ist es die Funktion oder das Prinzip an sich das ich es total falsch verstehe, bin ratlos. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:56 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