![]() |
AW: SetLength -> Zu wenig Arbeitsspeicher?
PS: Speicherdefragmentierung gibt's auch noch.
du hast z.B. - maximal 2 GB virtuellen Speicher verfügbar - gnügend physischen RAM + Auslagerungsdatei - aber einen voll defragmentierten virtuellen Speicher (es liegen da ja auch noch über DLLs und so'n Zugs rum) Wird ein dyn. Array in seiner größe geändert, dann wird/muß eventuell das Array umkopoert werden, weil es nicht Inplace vergrößert werden kann (liegt schon was Anderes dahinter). Nun brauchst du also: a) irgendwo ein Stückchen freien Speicher, wo die neuen Arraydaten reinpassen b) zwischenzeitlich auch mal bis zu doppelt soviel Speicher für das Array (neuer + alte Daten) [add] ich sage standardmäßig. Und es sind etwa 3,75 GB an virtuellen RAM, den Rest kann man mit 32 Bit nicht verwalten und eingige Bereiche wurden wohl aus Kompatibilitätsgründen (zur 31-Bit-signed-Adressierung) gesperrt. Mein Windows 32 Bit stellt z.B. nur 3,24 zur Verfügung (Integergrenzen und so) und der Rest wird entweder für Treiber werwendet und alles über 4 GB ist eh nicht adressierbar (abgesehn vom LAA / Large-Address-Aware, aber das muß aktiviert sein, das OS muß es unterstützen und deine Anwendung müßte es selbst behandeln) |
AW: SetLength -> Zu wenig Arbeitsspeicher?
hab mir schon sowas gedacht... kannst du vielleicht trotzdem mal wegen dem trick den du angesprochen hast nachgucken?
ich gucke mal, ob man irgendwelche daten wirklich auslagern kann. danke und viele grüße Alex |
AW: SetLength -> Zu wenig Arbeitsspeicher?
ok, meinte eigentlich auch, dass der Rechner zwar 4GB hat aber ja nur bis max. 3,5 (ca.) adressierbar sind.
Kann mann denn den Speicher irgendwie zur Laufzeit der Anwendung deframentieren? Sicherlich nicht oder? Viele Grüße Alex |
AW: SetLength -> Zu wenig Arbeitsspeicher?
Zitat:
Zitat:
|
AW: SetLength -> Zu wenig Arbeitsspeicher?
Gegen eine Defragmentierung kann man nicht viel machen, außer Speicheroperationen zu optimieren und seltener Speicher neu reservieren, umzureservieren/freizgeben und z.B. Speicherbplätze wiederzuverwenden.
Defragmentieren geht nicht, denn dann müßtest du im gesamten Programm sämtliche Zeiger kennen, welche auf die zu verschiebenden Teile zeigen (welche du nichtmal alle kennst) auch mit anpassen. Hast du denn mal nach Speicherlecks geschaut? (Beitrag #3) Oder installier dir das große FastMM und schau da mal in die MemoryMap (grafische Speichernutzungsübersicht). |
AW: SetLength -> Zu wenig Arbeitsspeicher?
Zitat:
|
AW: SetLength -> Zu wenig Arbeitsspeicher?
Wozu muss man Speicher überhaupt "defragmentieren"? Ich meine eine Festplatte verliert selber doch auch kaum Speicher wenn sie fragmentiert ist? Da geht es doch nur darum, schnell hintereinander darauf zuzugreifen?
MfG Fabian |
AW: SetLength -> Zu wenig Arbeitsspeicher?
Wenn aber kein zusammenhängender Speicherblock der entsprechenden Größe verfügbar ist, kann man auch kein solchen anfordern
|
AW: SetLength -> Zu wenig Arbeitsspeicher?
Speicherblöcke im RAM sind immer zusammenhängend ... Dateien können stückchenweise verteilt sein.
Defragmentieren heißt hier nur, daß zwischen den vielen Speicherblöck viele und eventuell zu kleine Speicherbereiche frei sind, welche man benutzen könnte. Wenn da z.B. nur 20.000 freie Bereiche a maximal 100 Byte überall verteilt rumliegen, sonst alles voll ist und du aber einen Block mit 1000 Byte benötigst, dann paßt der nirgendwo rein,obwohl insgesamt noch genug frei wäre. aber hier sollte man erstmal > nach Speicherlecks ausschau halten und eventuell > die Speichermap anschauen, ob es wirklich zu soeiner Defragmentierung kommt |
AW: SetLength -> Zu wenig Arbeitsspeicher?
Ich werde mir das mal angucken mit den Speicherlecks und Speichermap.
Vielleicht komm ich da ja dahinter... Glaube aber wirklich, dass es wirklich nur an der Fragmentierung liegt da laut TaskManager eben diese 2GB Grenze gar nicht erreicht wird von der Anwendung! Viele Grüße Alex |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:08 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