Wie kann ich verhindern, dass bei einem wachsenden TDictionary der Arbeitsspeicher knapp wird?

8

TDictionary<TKey,TValue> verwendet ein internes Array, das verdoppelt wird, wenn es voll ist:

%Vor%

Dies funktioniert gut mit einer mittleren Anzahl von Elementen, aber wenn man die obere Grenze erreicht, ist es sehr bedauerlich, weil es eine EOutOfMemory Ausnahme auslösen kann, selbst wenn fast die Hälfte des Speichers noch verfügbar ist.

Gibt es eine Möglichkeit, dieses Verhalten zu beeinflussen? Wie gehen andere Sammelklassen mit diesem Szenario um?

    
jpfollenius 02.12.2011, 11:51
quelle

1 Antwort

9

Sie müssen verstehen, wie ein Wörterbuch funktioniert. Ein Wörterbuch enthält eine Liste von "Hash-Buckets", in die die von Ihnen eingefügten Elemente platziert werden. Das ist eine endliche Zahl, also müssen Sie, sobald Sie es gefüllt haben, mehr Buckets zuweisen, da ist kein Weg vorbei. Da die Zuweisung von Objekten zu Buckets auf dem Ergebnis einer Hash-Funktion basiert, können Sie nicht einfach Buckets zum Ende des Arrays hinzufügen und dort Dinge einfügen. Sie müssen die gesamte Liste der Blöcke neu zuweisen. hash alles neu und setzen Sie es in die (neuen) entsprechenden Eimer.

Angesichts dieses Verhaltens ist die einzige Möglichkeit, das Wörterbuch nicht neu zu reservieren, wenn es voll ist, sicherzustellen, dass es nie voll wird. Wenn Sie die Anzahl der Elemente kennen, die Sie in das Dictionary einfügen, übergeben Sie sie als Parameter an den Konstruktor, und Sie werden keine Wörterbuchumverteilungen mehr durchführen.

Wenn Sie das nicht können (Sie kennen nicht die Anzahl der Elemente, die Sie im Wörterbuch haben), müssen Sie noch einmal überlegen, warum Sie TDictionary an erster Stelle ausgewählt und Daten ausgewählt haben Struktur, die einen besseren Kompromiss für Ihren speziellen Algorithmus bietet. Zum Beispiel könnten Sie binäre Suchbäume verwenden, da sie das Balancing durchführen, indem sie Informationen in bestehenden Knoten rotieren, ohne dass sie erneut zugewiesen werden müssen je .

    
Cosmin Prund 02.12.2011, 12:52
quelle