Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   SetLength -> Zu wenig Arbeitsspeicher? (https://www.delphipraxis.net/153654-setlength-zu-wenig-arbeitsspeicher.html)

himitsu 11. Aug 2010 11:56

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)

AJ_Oldendorf 11. Aug 2010 12:08

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

AJ_Oldendorf 11. Aug 2010 12:11

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

Bernhard Geyer 11. Aug 2010 12:15

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Zitat:

Zitat von AJ_Oldendorf (Beitrag 1041126)
ok, meinte eigentlich auch, dass der Rechner zwar 4GB hat aber ja nur bis max. 3,5 (ca.) adressierbar sind.

Ein 32-Bit prozess hat normalerweise nur 2GB zur Verfügung. 3GB mit entsprechenden compilerschalter ({$SetPeFlags $20}) wenn auch das OS mitspielt (64-Bit Windows immer, 32-Bit je nach Boot-Option.

Zitat:

Zitat von AJ_Oldendorf (Beitrag 1041126)
Kann mann denn den Speicher irgendwie zur Laufzeit der Anwendung deframentieren? Sicherlich nicht oder?

Nein. Du hast mit Delphi ein Unmanaged System das sowas praktisch nicht ermöglicht. In Managed Umgebungen (Java/.NET) wäre sowas möglich (weiß aber nicht ob es implementiert ist).

himitsu 11. Aug 2010 12:20

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).

DeddyH 11. Aug 2010 12:24

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Zitat:

Zitat von himitsu (Beitrag 1041131)
Gegen eine Defragmentierung kann man nicht viel machen, ...

Wieso sollte man auch? :angel2:

xZise 11. Aug 2010 12:24

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

mkinzler 11. Aug 2010 12:26

AW: SetLength -> Zu wenig Arbeitsspeicher?
 
Wenn aber kein zusammenhängender Speicherblock der entsprechenden Größe verfügbar ist, kann man auch kein solchen anfordern

himitsu 11. Aug 2010 12:35

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

AJ_Oldendorf 11. Aug 2010 13:01

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.
Seite 2 von 4     12 34      

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