Re: Dictionaries - schnell und effizient?



Michael v. Fondern schrieb:
Michael Stum:
Hallo,

ich muss in einer Anwendung eine Art verschachteltes assoziatives Array abbilden, also so etwas:

ID
+--Titel => Wert
+--Datum => Wert
+-- ...
+-- ...

Das Problem ist, das ich davon ca. 100.000 Stück kurzzeitig im Speicher halten muss und daher nicht eine eigene Klasse schreiben will (Der overhead scheint mir zu groß).

Ich nehme mal an, du meinst 100.000 IDs. Und die IDs lauten nicht 0,1,2,...,99999 , oder?

Ich brauche 100.000 Stück von diesen verschachtelten Dictionaries, also 100.000 unterschiedliche IDs.
Die IDs sind nicht sequentiell, sondern quasi zufällig (sprich: ich weiß vorher nicht, wie die sind, außer das es Int32 sind).


Da das "innere array" nicht typsicher sein muss, dachte ich an ein Dictionary<int,Dictionary<string,string>> - das soll wohl seit .net 2.0 besser sein als eine Hashtable und macht eigentlich genau das, was ich will.

Performance- und Speicherbedarf bei "Dictionary" wird sich gegenüber "Hashtable" wahrscheinlich nur geringfügig anders verhalten, Dictionary ist halt einfach die typsichere Variante.

Gäbe es eine resourcenschonendere Möglichkeit, so eine Struktur intern abzubilden, oder ist ein verschachteltes Dictionary schon der idealfall?

Du kannst natürlich einfach verschachtelte Listen nehmen - das braucht garantiert etwas weniger Speicher, nur der Zugriff ist dann bei großen Datenmengen bedeutend langsamer. Wenn deine innere Struktur allerdings nur wenige Einträge hat, ist nicht gesagt, ob nicht eine Liste sogar schnellere Zugriffe liefert als ein Dictionary. Definier dir doch mal folgendes:

class Pair
{
public string Schlüssel;
public string Wert;
}

und nimm dann ein Dictionary<int , List<Pair> >. Das Suchen und Finden von Werten anhand eines Schlüssels in der Liste geht dann natürlich nicht mehr ganz so elegant wie vorher, wenn deine Listen allerdings sehr klein sind (<5 bis 10 Elemente), wird sich das von der Performance her kaum vom Dictionary unterscheiden. Noch ein Tipp: sorge dafür, dass die List-Instanzen möglichst exakt die Kapazität haben ( Synopsis: new List<Pair>(capacity) ) , die sie brauchen, nicht mehr und nicht weniger, das spart Speicher und bringt evtl. auch Performance.


Danke, das probiere ich mal aus!
Generell hat die Innere Liste maximal 56 Unterpunkte, momentan sind es 10.
Eine eigene Klasse wollte ich vermeiden weil das ja Overhead bedeutet, aber ich komme dabei aus dem PHP Bereich wo ein array deutlich "billiger" ist als eine Klasse - aber bei einer List<> oder Dictionary<> habe ich eh eine Klasse, also probiere ich mal, meine eigene oder ob eine List<> besser ist.

Danke für den Tipp!


--
http://www.Stum.de

e-Mail Adresse ist gültig, wird aber äußerst selten gelesen.
.



Relevant Pages

  • Re: wie Array =?ISO-8859-15?Q?f=FCr_statische_Methoden?=
    ... Kriterien, über die wir uns wohl einigermaßen einig sind, zutreffen dann benutze ich diesen Modifier eben auch, sonst nicht. ... entsprechenden Klasse und die Kostet auf jeden Fall Speicher selbst wenn es keine lokalen Variablen gibt. ... Gerade wenn es mehrere Aufrufer gibt und die immer wieder eine Instace von der Klasse erstellen müssen nur um eine simple Utility-Methode aufzurufen dann belastet das bei Java ja auch noch den GC. ...
    (de.comp.lang.java)
  • Re: Richtige Zerstörung von eigenen Objekten
    ... Natürlich sind meine Klasse keine sehr komplexen Klassen. ... das ich direkt keine Speicher freigeben kann. ... Finalize-Methode aufgerufen und durchgefuehrt werden kann. ... >benötigten Klasseninstanzen zu zerstören. ...
    (microsoft.public.de.german.entwickler.dotnet.vb)
  • Re: Dictionaries - schnell und effizient?
    ... Michael Stum: ... das ich davon ca. 100.000 Stück kurzzeitig im Speicher halten muss und daher nicht eine eigene Klasse schreiben will. ... "Hashtable" wahrscheinlich nur geringfügig anders verhalten, Dictionary ist halt einfach die typsichere Variante. ... Das Suchen und Finden von Werten anhand eines Schlüssels in der Liste geht dann natürlich nicht mehr ganz so elegant wie vorher, wenn deine Listen allerdings sehr klein sind, wird sich das von der Performance her kaum vom Dictionary unterscheiden. ...
    (microsoft.public.de.german.entwickler.dotnet.csharp)
  • Re: wie Array =?ISO-8859-15?Q?f=FCr_statische_Methoden?=
    ... entsprechenden Klasse und die Kostet auf jeden Fall Speicher selbst wenn es keine lokalen Variablen gibt. ... Wenn du eine static methode aufrufst musst du auch eine Reference auf dem Stack haben, nämlich die Klasse. ... Probleme als Performanceverlust bzw. -gewinn durch ändern einnes Modifier! ...
    (de.comp.lang.java)
  • Re: Memoryblock
    ... Zugriff über folgendes Konstrukt erhalten: ... Speicher zu verschwenden, ... Am meisten lernt man was über die Funktionsweise einer Klasse, ... Wer Komponenten ohne Quelltext oder richtig miese Komponenten ...
    (de.comp.lang.delphi.misc)

Quantcast