Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi dyn array erweitern problem (https://www.delphipraxis.net/33984-dyn-array-erweitern-problem.html)

supermuckl 15. Nov 2004 20:50


dyn array erweitern problem
 
hiho.. hab mir mal vor ner woche mal schnell nen kleines prog schreiben wollen..
hab halt damit den verzeichnisbaum rekursiv erfassen wollen und das in ein dynamisches array schreiben wollen ( path + filename usw )

das dynamische array war vom typ record wobei dieses 2 string und eine integer variable beinhaltete.

wenn ich nun mit diesem findfirst, findnext gedöns das dynarray gefüllt hatte stieg der ramverbrauch ins unermessliche an und dann war nach ein paar sekunden sense ( nicht genügend speicher verfügbar fehler )

das problem war, das ich bei jedem schleifendurchgang ( der ja jedesmal ein file erfasste ) das dynamische array um 1 item vergrössert hatte..

wenn ich dieses vergrößern nun alle 1000 files(schleifendurchgänge) ausgelöst hatte und das array um 1000 items vergrössert hatte, funktionierte alles bestens ( ram verbrauch normal usw )

was genau hat sich hierbei abgespielt ?

wieso steigt der ramverbrauch so an ? und mit blockmäßiger vergrösserung nicht ?

hoffe mir kann jemand ein wenig erklären was da abgeht :)

hat bestimmt was mit der array verwaltung zu tun..

dieser code wurde verwendet, um in der schleife, das array zu vergrössern:

Delphi-Quellcode:
         if ((filecount mod 1000) = 0 )then setlength(alist,length(alist)+1000);
          inc(filecount);
und dieser hatte nicht funktioniert:

Delphi-Quellcode:
         setlength(alist,length(alist)+1);

Luckie 15. Nov 2004 20:56

Re: dyn array erweitern problem
 
Ganz einfach. Wenn du ein dynamisches Array vergrößerst, wird Speicher reserviert für das alte plus die zusätzlichen Elemente. dann wird das alte Array in den neu reservierten Speicher kopiert. Der Speicherbereich des alten Arrays wird aber nicht wieder an Windows zurückgegeben, da der Delphi Speichermanger dahingegenoptimiert wurde kleine Speicherbereich zu verwalten, wie es bei der OOP Programmierumng meist der Fall ist. Und jedes mal wieder Speicher von Windows anzufprdern kostet Zeit und bedeutet für Windows einen erhöhten Verwaltungsaufwand.

supermuckl 15. Nov 2004 21:11

Re: dyn array erweitern problem
 
seh ich das dann richtig das niemals der alte speicherbereich freigegeben wird? kann ich mir garnich vorstellen weil wenn ich jetzt schon 2 MB in meinem array hab und das um 1000 records vergrößer müsste ja dann 4 MB + die 1000 items an platz gebraucht werden ( dann wirds kopiert ) und der alte bereich nicht freigegeben ? komischer weise wird halt nie soviel speicher verbraucht wenn das so wäre das es nicht freigegeben wird *verwirrt bin*

oder ist es so das nur nach einer größeren veränderung, windows da die alten bereiche freigibt?

ich peil das grad voll net wenn du sagt das es nicht vom programm selbst freigegeben wird..

Luckie 15. Nov 2004 21:15

Re: dyn array erweitern problem
 
Nein, Windows hat keinerlei Einfluss auf den Speicherbereich deiner anwendung. Die Verwaltung obligt alleine dem Delphi Speichermanager (bzw. dem Speichermanager der Programmiersprache, die du nutzt). Und irgendwann wird auch der Delphispeichermanager wieder Speicher an Windows zurückgeben, aber nicht jedes mal wenn was frei wird eben. Gründe siehe mein erstes Posting.

supermuckl 15. Nov 2004 21:20

Re: dyn array erweitern problem
 
ok das macht sinn blos wann macht er es ? ist es zeitlich begrenzt ? weil per volumen kanns ja net sein sonst wäre das problem ja nich da ?!

Luckie 15. Nov 2004 21:25

Re: dyn array erweitern problem
 
Zitat:

Zitat von supermuckl
ok das macht sinn blos wann macht er es ? ist es zeitlich begrenzt ? weil per volumen kanns ja net sein sonst wäre das problem ja nich da ?!

Das weiß wohl nur Borland. Kuck doch mal in den entsprechendne Newsgroups von Borland.

supermuckl 15. Nov 2004 21:27

Re: dyn array erweitern problem
 
du meinst im BDN ? in newsgroups war ich noch nie unterwegs..


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 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