Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Speicherverbrauch und Sortierung (https://www.delphipraxis.net/170961-speicherverbrauch-und-sortierung.html)

nuclear 12. Okt 2012 10:31

Speicherverbrauch und Sortierung
 
Hallo zusammen,
ich habe eine Komponente geschrieben, welche änlich zu der WIn32 komponente TreeView ist (jedoch keine grafische Ausgabe). Das Problem ist nur das ich die Daten in ein dynamisches Array schreibe. Dies ist ein Problem, da ich min 2.000.000 Datensätze damit verwalten wollte. Dies verbraucht viel zu viel Ram. Ein anderes Problem ist die Sortierung der Einträge. Da ich bei dem hinzufügen ja schon ein vorsortiertes Array habe dachte ich mir, das es mit InsertionSort relativ schnell gehen müsste. Dies ist bis zu 100.000 Objekten der Fall wird danach jedoch sehr langsam. Gibt es dafür einen schnelleren Algorytmus?
Danke im vorraus.
nuclear

DeddyH 12. Okt 2012 10:37

AW: Speicherverbrauch und Sortierung
 
Am RAM-Verbrauch kannst Du wahrscheinlich wenig machen, irgendwo müssen die Daten ja vorgehalten werden. Allerdings würde ich selbst wohl statt eines dynamischen Arrays eine (generische) TList/TObjectList verwenden. Die benutzen intern einen Quicksort und tauschen nicht die Daten an sich, sondern nur die Pointer darauf IIRC.

nuclear 12. Okt 2012 10:49

AW: Speicherverbrauch und Sortierung
 
Danke, ich hatte aus irgend einem Graund nicht an eine TList gedacht. Ist denn quicksort bei einer vorsortierten liste schneller als ein InsertionSort? Ich nutze zum Sortieren selber auch Pointer. Wie ist denn die Geschwindigkeit bei einer TList bei einem erstellen eines neuen Elements im vergleich zu einem dynamischen array? MAcht das wirklich einen großen Unterschied?

DeddyH 12. Okt 2012 10:57

AW: Speicherverbrauch und Sortierung
 
Es kommt darauf an. Wenn Du immer wieder SetLength() aufrufst, wird ein neues Array in der passenden Größe erstellt, das alte dort hineinkopiert und anschließend freigegeben. TList hingegen hält intern ein statisches Array[integer] of Pointer vor, und merkt sich darin nur die Zeiger auf die Daten, da muss nicht hin und her kopiert werden. Das hat außerdem den Vorteil, dass die Daten nicht im Block vorliegen müssen wie bei einem Array.

r2c2 12. Okt 2012 11:05

AW: Speicherverbrauch und Sortierung
 
Ich denke das eigentliche Problem ist ein architektonisches.

- Kein User will auf einmal 2 Mio Datensätze sehen (außer vielleicht in nem Scatterplot oder so)
- Keiner sagt, dass du also immer alle Daten im RAM halten musst.
- Um so große Datenmengen vorzuhalten und zu verarbeiten, wurden Datenbanken erfunden
- Um Baumstrukturen in ne DB zu kriegen hast du mehrere Möglichkeiten: FKs auf den Parent, ne n:m-Tabelle, Nested Sets und spezielle Graph-basierte NoSQL-Datenbaken.
- Alle genannten Ansätze haben ihre Vor- und Nachteile, die im konkreten Fall abzuwägen sind.
- Sortierung übernimmt die DB, Datenhaltung übernimmt die DB, Performanceoptimierung übernimtm die DB
- ...

mfg

Christian

p80286 12. Okt 2012 11:14

AW: Speicherverbrauch und Sortierung
 
Da liegst du nicht ganz falsch, aber falls Datenanalyse betrieben werden muß, mußt Du die Möglichkeit haben alle Daten zu sehen. etwas anderes ist es, nur einen Teil der Daten zur Anzeige zu bringen.

Gruß
K-H

r2c2 12. Okt 2012 11:51

AW: Speicherverbrauch und Sortierung
 
Zitat:

Zitat von p80286 (Beitrag 1186768)
Da liegst du nicht ganz falsch, aber falls Datenanalyse betrieben werden muß, mußt Du die Möglichkeit haben alle Daten zu sehen. etwas anderes ist es, nur einen Teil der Daten zur Anzeige zu bringen.

So pauschal kann man das nicht sagen. Je nachdem, was du an Analyse so zu tun hast, kannst du die schon DB-Seitig vornehmen. Oder du lädst häppchenweise aus der DB und aggregierst die Analyseinfos. So hast du nie alles im RAM. Was hier die geschickteste Variante ist, hängt sehr stark von den jeweiligen Anforderungen und Rahmenbedigungen ab. Vielleicht ist es im konkreten Fall auch gut alles im Speicher zu halten. Auch solche Fälle gibts. Kommt halt drauf an...

mfg

Christian

himitsu 12. Okt 2012 12:16

AW: Speicherverbrauch und Sortierung
 
Es kommt auch drauf an, was das für Daten sind und wie groß.

Das Array of Object/Pointer ist selber NUR etwa 8 MB (bis zu 16 MB bei Größenänderung).
Bei einem Array of Record sieht das dann etwas anders aus.

SirThornberry 12. Okt 2012 12:34

AW: Speicherverbrauch und Sortierung
 
Die Sortierung sollte schneller sein wenn man eine Liste mit Pointern-Objekten hat und somit nur die Pointer in eine andere Reihenfolge bringt. Wenn man die Daten direkt im Array hat kann je nach Größe eines Array-Eintrages schon eine Menge Zeit beim hin und her kopieren verloren gehen.

DeddyH 12. Okt 2012 12:39

AW: Speicherverbrauch und Sortierung
 
Das hatte ich anzudeuten versucht, da ich annahm oder noch annehme, dass das Array die tatsächlichen Daten enthält und keine Zeiger.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:57 Uhr.
Seite 1 von 3  1 23      

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