Ich habe eine Dictionary<string,int>
, die das Potenzial hat, mehr als 10 Millionen eindeutige Schlüssel enthalten. Ich versuche, die Menge des Gedächtnisses zu reduzieren, die das dauert, während ich noch die Funktionalität des Wörterbuchs beibehalte.C# Dictionary Memory Management
Ich hatte die Idee, einen Hash der Zeichenfolge als eine lange stattdessen speichern, dies verringert die apps Speicherauslastung auf einen akzeptablen Betrag (~ 1,5 Gig bis ~ 0,5 GB), aber ich fühle mich nicht sehr gut meine Methode dafür.
long longKey=
BitConverter.ToInt64(cryptoTransformSHA1.ComputeHash(enc.GetBytes(strKey)), 0);
Grundsätzlich zerhackt dies das Ende einer SHA1 Hash-off, und setzt das erste Stück davon zu einem langen, die ich dann als Schlüssel verwendet werden. Dies funktioniert zumindest für die Daten, mit denen ich gerade teste, aber ich glaube nicht, dass dies eine sehr zuverlässige Lösung ist, da die Wahrscheinlichkeit von Schlüsselkollisionen erhöht ist.
Gibt es andere Möglichkeiten, den Speicherbedarf des Wörterbuchs zu reduzieren, oder ist die Methode, die ich oben habe, nicht so schrecklich, wie ich denke, dass es ist?
[Bearbeiten] Um zu verdeutlichen, muss ich die Fähigkeit zum Nachschlagen eines Wertes im Wörterbuch mit einer Zeichenfolge beibehalten. Das Speichern der tatsächlichen Zeichenfolge im Wörterbuch erfordert viel Speicherplatz. Was ich stattdessen tun möchte, ist eine Dictionary<long,int>
verwenden, wobei die lange ist das Ergebnis einer Hash-Funktion auf der Zeichenfolge.
Wörterbuch? –
Diadistis
Ich bezweifle die Möglichkeit für Kollisionen ist realistisch mit einem 64-Bit-Hash. –
Ich würde mir vorstellen, dass dies auch der Fall ist, aber nur die Bytes in zwei Hälften "zu zerhacken" scheint irgendwie zweifelhaft. –