AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi C++ Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

Offene Frage von "Zacherl"
Ein Thema von Michaell · begonnen am 12. Mär 2018 · letzter Beitrag vom 15. Mär 2018
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von himitsu
himitsu

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

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 12. Mär 2018, 19:39
Für die 300 MB ist so schon kaum freier Speicher.
Wenn du vorher nun noch mehr Speicher im RAM belegst, dann erhöht sich die Chance, dass kein zusammenhängender 300 MB-Block mehr verfügbar ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.691 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 12. Mär 2018, 20:06
Du könntest dir eine Prozedur schreiben die den komplett installierten (nicht nur den freien) Speicher belegt so das Windows gezwungen wird Auszulagern, nun gib den Speicher wieder frei, je nach Windows Einstellung steht Dir nun sehr viel mehr am Stück zur Verfügung oder Dll's von anderen Anwendungen laden sich selbst wieder in den schnellen Speicher, das mehr frei ist > ist ein positiver Nebeneffekt, das es Zeit kostet (auch Windows Nachladezeit, da alle Caches danach überfüllt bzw geleert sind) ist als negativer Aspekt anzusehen (Icons Fenter Text Farben alles wird neu erschaffen).
(Ziel der Übung: Memory Defrag)
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.212 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 12. Mär 2018, 21:20
Das ist nicht richtig.

Was Windows macht ist völlig unerheblich, Windows hat genug Puste. Eine Anwendung (z.B. Delphi) arbeitet sowieso nicht mit "echtem" Hauptspeicher sondern mit virtuellem Speicher. Das Betriebssystem (z.B. Windows) kümmert sich in Kombination mit spezieller Hardware-Beschleunigung aus der CPU um die Übersetzung von virtuellen Adressen deines Prozesses in die entsprechenden "echten" Speicheradressen.

Der virtuelle Speicher ist hierbei weiterhin in Seiten unterteilt. Das Ein- und Auslagern betrifft Seiten. Es ist egal welche Seiten Windows hier ein- und auslagert, das Problem betrifft seinen privaten, virtuellen 2GB-Adressraum für seinen Prozess. Davon dass diese Seiten auch wild über den Arbeitsspeicher verteilt sein können (siehe Bild) wollen wir gar nicht erst anfangen.

Viele kleine Stücke zu belegen und anschließend freizugeben verändert nicht die "Reihenfolge" in diesem Adressraum. Es wird ihm danach nicht mehr zusammenhängender Speicher zur Verfügung stehen.

Viel Zeit zum Lesen?
  1. https://de.wikipedia.org/wiki/Paging
  2. Silberschatz et. al: Operating System Concepts
Angehängte Grafiken
Dateityp: png paging example.png (184,1 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 12. Mär 2018, 21:51
Ich denke, da läuft grundsätzlich was falsch bei ihm. Man nehme doch nur mal Photoshop oder Audio-Bearbeitungsprogramme, die auch schon unter 32 Bit mit großem Dateien umgehen konnten. Also ich bin ja meist der Überzeugung, wenn man an die Grenzen von Windows stößt, macht man was falsch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 08:45
je nach Windows Einstellung steht Dir nun sehr viel mehr am Stück zur Verfügung
Nein, eben nicht. Auf den virtuellen Speicher jedes Prozesses hat es absolut keinen Einfluss.
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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Mär 2018 um 11:55 Uhr)
  Mit Zitat antworten Zitat
bra

Registriert seit: 20. Jan 2015
711 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#6

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 11:42
Du könntest dir eine Prozedur schreiben die den komplett installierten (nicht nur den freien) Speicher belegt so das Windows gezwungen wird Auszulagern, nun gib den Speicher wieder frei, je nach Windows Einstellung steht Dir nun sehr viel mehr am Stück zur Verfügung oder Dll's von anderen Anwendungen laden sich selbst wieder in den schnellen Speicher, das mehr frei ist > ist ein positiver Nebeneffekt, das es Zeit kostet (auch Windows Nachladezeit, da alle Caches danach überfüllt bzw geleert sind) ist als negativer Aspekt anzusehen (Icons Fenter Text Farben alles wird neu erschaffen).
(Ziel der Übung: Memory Defrag)
Sorry, aber das ist einer der dümmsten Vorschläge die ich seit langem gelesen habe. Wenn ein Programm sowas machen würde, wäre das innerhalb von Sekunden wieder deinstalliert und der Entwickler auf ewig auf meiner Blacklist.
  Mit Zitat antworten Zitat
Michaell

Registriert seit: 17. Aug 2015
Ort: Bayern
47 Beiträge
 
Turbo C++
 
#7

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 13:44
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:
Bitmap->PixelFormat = pf1bit;
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.)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 13:55
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.
Der Grund (Speicher-Fragmentierung) wurde doch schon mehrmals genannt?

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

Geändert von himitsu (13. Mär 2018 um 13:58 Uhr)
  Mit Zitat antworten Zitat
Michaell

Registriert seit: 17. Aug 2015
Ort: Bayern
47 Beiträge
 
Turbo C++
 
#9

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 14:16
Der Grund (Speicher-Fragmentierung) wurde doch schon mehrmals genannt?
Ja, nur das ich daran seit meinem Umsortieren der Forms nicht mehr Glaube! (Ich schreibe nichts von Wissen.)

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.

Geändert von Michaell (13. Mär 2018 um 14:16 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
Michaell

Registriert seit: 17. Aug 2015
Ort: Bayern
47 Beiträge
 
Turbo C++
 
#10

AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.

  Alt 13. Mär 2018, 14:20
... Eine andere Stelle kenne ich nicht, auch nicht Optionen um das zu ändern.
OK, hab die Optionen gefunden. Mal sehn ob sich damit etwas mehr Information gewinnen läßt.

Geändert von Michaell (13. Mär 2018 um 14:20 Uhr) Grund: Korrektur
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 19:13 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