AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

SetLength -> Zu wenig Arbeitsspeicher?

Ein Thema von AJ_Oldendorf · begonnen am 11. Aug 2010 · letzter Beitrag vom 18. Aug 2010
Antwort Antwort
Seite 4 von 4   « Erste     234   
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#31

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 12:14
Das ist doch wohl trivial, daß der Speicherbedarf ansteigt, wenn Du Gigabyte-weise davon anforderst. Mir ist nur nicht klar, warum es im zweiten Fall nicht zum Anwachsen kommen soll (weil zu schnell geht?) Irgendwann läufts Du doch wohl in beiden Fällen in die Exception, und dann wird doch hoffentlich abgeräumt!? Wenn keine Exception kommt, ist eh nach 32 Durchläufen Schicht wegen 2^32=0 mod 2^32.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#32

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 12:32
ich wollte damit auch nicht sagen, dass es mir unklar ist, warum der Speicher steigt. Klar muss er steigen wenn ich jede Menge anfordere...
Aber warum steigt er im zweiten Beispiel nicht? Das ist die spannende Frage?
Das irgendwann ein Int-Überlauf entsteht ist auch klar. Aber darum gehts hier nicht

Viele Grüße
Alex
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#33

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 12:36
Weil du ihn direkt nach dem Reservieren wieder freigibst. Er steigt wahrscheinlich schon, aber er sinkt halt schneller wieder als du gucken kannst...
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 12:37
Gut, der Arbeitsspeicher wird nicht linear, sondern mehr chaotisch vergeben, aber im Prinzip sollte es so klar werden

Code:
. while True do
  begin
1   a := nil; // ja, das geht auch ^^
2   SetLength(a, i);
    i := i * 2;
  end;


  mit zurücksetzen  ohne zurücksetzen
2 |*                 |*
1 |                  |*
2 |++                |*++
1 |                  | ++
2 |****              | ++****
1 |                  |   ****
2 |++++++++          |   ****++++++++
1 |                  |       ++++++++
2 |****************  |       ++++++++****************

= |################  |---------------################
Wenn Delphi das Array vergrößer/verkleiner muß und das nicht inplace geht, indem hinten dran neuer Speicher angehängt oder entfernt wird, dann muß erstmal neuer Speicher reserviert werden, dann wird der Inhalt des alten Speichers rüberkopiert und danach dieser freigegeben.
Nun ist entsteht hier aber an den alten Speicherstellen eine Lücke, welche kleiner ist, als der nächste zu reservierende Speicher, weswegen dieser da nicht reinpaßt und er somit nicht nutzbar ist.
Im Endefekt hat man zwar selber genausoviel Speicher #### genutzt, aber es bleibt auch noch viel Ungenutzer --- übrig.

Hier muß man auch noch beachten, daß der Delphispeichermanager Speicher in Blöcken/Gruppen bei Windows anfordert und diesen stückchenweise an unsere Programme abgibt.
Diese Blöcke/Gruppen können aber nur an Windows zurückgegeben werden, wenn alle Einzelteil wieder vom Programm freigegeben wurden.
Heißt also, von Seiten des Windows ist der ganze Block benutzt, selbst wenn das Programm nur einen Bruchteil davon verwendet.

Und jetzt stell dir vor, daß es nicht nur diesen einen(zwei) Teile gibt, sondern Viele und das da schonmal viele Lücken entstehen können.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
AJ_Oldendorf

Registriert seit: 12. Jun 2009
385 Beiträge
 
Delphi 12 Athens
 
#35

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 12:45
Danke Himitsu für deine Erklärung.
Wenn ich das richtig verstehe, ist es für den Speicherverbrauch egal ob ich vorher Nil bzw. das Setlength(a,0) aufrufe aber für die Struktur im Speicher (Lücken) es besser ist, diese Aufrufe vorher zu machen.

Gruß
Alex
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#36

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 12. Aug 2010, 14:19
Moin,
[...]Achja, was mir mal aufgefallen war:

SetLength(ArrayEinesTyps, 2);

rufe ich das einmal auf, so wird der Speicher einmal für zwei ArrayEintraege belegt.
Rufe ich das nochmals auf, so wird ungenutzter Speicher dafür neu belegt, der alte aber nicht freigegeben, laut Taskmanager bleibt der RAM genutzt. [...]
Bist du dir da sicher? Ich behaupte mal so, dass sogut wie keiner das alte Array "freigibt". Und MemoryLeaksOnShutdown meldet da ja auch nichts. Aber ich teste es einfach mal.

[...]

MfG
Fabian

Hi,

ich hatte dieses Problem öfters mit Record-Arrays kann dir aber auch so nicht sagen, wie das Problem genau zustande gekommen ist.
Ich nutze halt seit dem, wenn ich noch mit arrays arbeite zusätzlich einfach das SetLength(x, 0); mittlerweile aus Gewohnheit.
Vielleicht liegt es an den Records oder an bestimmten Datentypen im Record?!

Gruß
angos
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#37

AW: SetLength -> Zu wenig Arbeitsspeicher?

  Alt 18. Aug 2010, 10:34
Danke Himitsu für deine Erklärung.
Wenn ich das richtig verstehe, ist es für den Speicherverbrauch egal ob ich vorher Nil bzw. das Setlength(a,0) aufrufe aber für die Struktur im Speicher (Lücken) es besser ist, diese Aufrufe vorher zu machen.

Gruß
Alex
Naja das kommt aber auch auf die Verwendung drauf an. Wenn du das Array nämlich nur verlängern willst, dann kannst du das nicht machen.

Und wie du siehst angos kommt es bei mir zu keiner Änderung der Speichergröße, weil der Speichermanager wohl intelligent genug ist, und immer den gleichen Speicherblock nutzt.

Weil du ihn direkt nach dem Reservieren wieder freigibst. Er steigt wahrscheinlich schon, aber er sinkt halt schneller wieder als du gucken kannst...
lol? Er steigt aber (eigentlich) insgesamt. Also danach müsste er mindestens doppelt so viel belegen, weil das ganze Array ja nochmal rein muss. Das heißt kurzzeitig ist es auf 0 Byte Verbrauch durch das array, aber dann sofort auf das doppelte von vorher.

MfG
Fabian
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler

Geändert von xZise (18. Aug 2010 um 10:36 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 4   « Erste     234   


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 21:25 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