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.

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 4 von 6   « Erste     234 56   
Benutzerbild von himitsu
himitsu

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

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

  Alt 13. Mär 2018, 09: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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

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

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

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

  Alt 13. Mär 2018, 12: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++
 
#33

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

  Alt 13. Mär 2018, 14: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.145 Beiträge
 
Delphi 12 Athens
 
#34

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

  Alt 13. Mär 2018, 14: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)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.

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

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

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

  Alt 13. Mär 2018, 15: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 15:16 Uhr) Grund: Typo
  Mit Zitat antworten Zitat
Michaell

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

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

  Alt 13. Mär 2018, 15: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 15:20 Uhr) Grund: Korrektur
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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

  Alt 13. Mär 2018, 16:08
Alter Taskmanager (Win XP/7) im Menü Ansicht
und beim Neuen Windows 8/10 im Kontextmenü der Gridspalten.

Zitat:
Ja, nur das ich daran seit meinem Umsortieren der Forms nicht mehr Glaube!
Und warum nicht?

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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Michaell

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

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

  Alt 13. Mär 2018, 17:50
OK, hab die Optionen gefunden. Mal sehn ob sich damit etwas mehr Information gewinnen läßt.
Ich habe nun drei neue "Memory" Spalten im Task Manager, die neue max. angezeigte Speichergröße ist ca. 300 MiB und aus Spalte Peak Working Set (Memory) entnommen. Nach wie vor sieht man keine großartige Speicherbelegung. Ist mir aber auch egal, der Fehler tritt nicht mehr auf und ich will keine weitere Zeit dazu spendieren.
  Mit Zitat antworten Zitat
bra

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

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

  Alt 14. Mär 2018, 10:41
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.
  Mit Zitat antworten Zitat
Benutzerbild von KodeZwerg
KodeZwerg

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

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

  Alt 14. Mär 2018, 14:19
Es wurde ja bereits verkündet das meine Idee mit Speicher füllen falsch sei, ich habe es so getestet:

Delphi-Code:
Code:
procedure MyTrimWorkingSet;
var hProcess: THandle;
begin
 hProcess := OpenProcess(PROCESS_SET_QUOTA, false, GetCurrentProcessId);
 try
  SetProcessWorkingSetSize(hProcess, $FFFFFFFF, $FFFFFFFF);
 finally
  CloseHandle(hProcess);
 end;
end;
Könnte mir bitte jemand sagen was daran falsch sei damit ich es endlich Verstehe?
Ist es die Funktion oder das Prinzip an sich das ich es total falsch verstehe, bin ratlos.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 04:33 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