![]() |
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.
Zitat:
Kann per Compiler-Befehl auf 3 GB (32 Bit Windows) oder fast 4 GB (64 Bit Windows) erhöht werden. Vielleicht reicht das bei dir aus. Windows hat auch noch eine Auslagerungsdatei, womit die 4 GB physicher RAM im globaler Speicher mehr sind. Selbst bei 1 GB RAM kann ein Programm diese 2 GB nutzen (wenn genügend freier Speicher inkl. Pagefile vorhanden sind) Und wie bereits erwähnt liegt beim BITMAP der Speicher als ein zusammenhöngender Block vor und da wird es in 32 Bit-Programmen ab durchschnittlich 250-300 MB schnell eng, zwischen all den geladenen DLLs, der EXE und dem restlichen genutzten Arbeitsspeicherstückchen, sind nur selten größere Bereiche verfügbar. Im FastMM oder ![]() ![]() ![]() Die Executables (DLL/EXE) liegen nicht immer auf der selben Adressen. ![]() Und auch der restliche dynamische Speicher wird mehr "zufällig" verteilt reserviert. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Danke himitsu, von Deinen Aussagen ist die hier nach meiner derzeitigen Meinung der Knackpunkt:
Zitat:
Das Problem ist also: Ich habe im 2 GiB Virtuellen-Adressraum meines Programms öfters mal keinen zusammenhängenden Bereich von 297.5625 MiB (8832 * 8832 * 4 Bytes) übrig um meine Speicheranforderung zu bedienen. Lösungsmöglichkeit: Das Problem kann evtl. dadurch umgangen werden, das man dem Compiler mitteilt, das er 3 GiB Virtuellen-Adressraum nutzen soll. OK, ich werde sehen wie ich das hinbekomme und Melde mich dann. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Damit verschleppst du das Problem höchstens ein bisschen.
Dein Problem ist dass du Speicherfragmentierung hast. Ich kenne TBitmap zu wenig, aber vielleicht kann man den Bereich früh einmal anfordern und dann nicht mehr freigeben? Notfalls erstellst du einmal dein entsprechendes TBitmap und arbeitest immer mit dieser einen Instanz weiter. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Zitat:
P.S. Eine Compiler Option für "3 GiB virtual address space" konnte ich bisher nicht finden. |
AW: Fehler: Für diesen Befehl ist nicht genügend Speicher verfügbar.
Eine zuverlässige Lösungsmöglichkeit, die nicht auf irgendwelchen esoterischen Windows Speicherverwaltungs-Optionen oder Compiler-Switches basiert, habe ich weiter oben bereits genannt.
|
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.
Du hast 4 GB physisch und das sind meistens 6-8 GB global.
Ja, wenn da "insgesamt" weniger zur Verfügung steht, als dein Programm anfragt, dann knallt es auch. > im physischen RAM und der Auslagerungsdatei muß der Block nicht zusammenhängen (er kann auch fragmentiert dem virtuellen Block zugewiesen sein ... wird zur Laufzeit dynamisch zugewiesen/umkopiert) > in deinem privaten virtuellen Prozessspeicher ist ein Bitmap oder ein String oder ein Array immer am Stück und muß somit einem zusammenhängenden Bereich Platz finden.
Code:
Windows versucht auf Home-Systemen die Binaries (DLL/EXE) zwischen den Prozessen zu sharen und wiederverwendet vorberechnete DLLs.
**************** 16 MB RAM
* ** *** * 7 MB schon belegt ******** 9 MB sind zwar noch frei, aber ein 8 MB-Bitmap passt dennoch nicht in eine der oberen Lücken Wird eine DLL/EXE verschoben, dann muß deren Speicher angepasst werden, also überall die Adressen anpassen. Da ist es einfacher das nur einmal zu machen und dann allen Programmen die selbe angepasste DLL zu geben > nur einmal "real" Speicher, auf den alle Programme nur virtuell verweisen. (wird aber nicht dauerhaft gespeichert und ist beim Neustart erstmal weg) Spart beim Programmstart zeit, wenn die DLL schon fertig berechnet wiederverwendet wird. (OK, damals waren die Computer noch etwas langsamer und hatten weniger RAM) ![]() ![]() Auf Server-Systemen geht man davon ab (kann man auch für User-Systeme aktivieren), damit bei jedem Programm die selbe DLL nicht an der selben virtuellen Stelle liegt. Macht das blinde Hacken mit statischen Adressen nahezu unmöglich. (schwerer für Viren, Trojaner usw.) ![]() PS: Im Taskmanager gibt es mehrere Werte für den Arbeitsspeicher. "Zugesicherte Größe" ist das, was dein Programm wirklich verbraucht. und "Arbeitsspeicher (privater Arbeitssatz) dürfte das sein, was davon grade im physischen RAM liegt. (der Rest ist ausgelagert) * aktiver Speicher > das was grade im RAM liegt * reservierter Speicher > das was in deinem virtuellen Speicher belegt ist (inkl. oder exkl. gemapptem Speichers > z.B. EXE/DLL und MMF aka Memory-Mapped-Files) * und es gibt Speicher, den du reserviert hast, der aber grade nicht in deinem virtuellen Speicher gemappt ist (wird von normalen Programmen selten genutzt) * uvm. |
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.
Bei halbwegs aktuellen 64 Bit-Windowsen ist das standardmäßig schon seit Jahren aktiviert.
Zitat:
Es gab "früher" viele Programmierer, die hatten
Delphi-Quellcode:
als "ungültig" angesehn und dann teilweise in diesem Bereich sogar Zusatzinfos im Pointer gespeichert.
Integer(Pointer) <= 0
Sowas knallt, wenn Windows dem Programm plötzlich mehr als 2 GB Speicher gibt ... darum muß das im Programm erst aktiviert werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:28 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