Ich habe einige Code, den ich ein verschachteltes Wörterbuch hinzugefügt, im folgenden FormatSpeichernutzung von Wörterbücher in C#
Dictionary<string, Dictionary<string, Dictionary<string, float>>>
Nachdem damit ich die Speichernutzung meiner Anwendung DEUTLICH geschossen bemerkt. Diese Wörterbücher werden auf Strings getaktet, die oft wiederholt werden, und es gibt viele dieser Wörterbücher in der Größenordnung von Zehntausenden.
Um dieses Problem anzugehen, stellte ich die Hypothese auf, dass die wiederholten Strings eine beträchtliche Menge an Speicher auffressen. Meine Lösung war die Saiten Hash und eine ganze Zahl zu verwenden, anstatt (I eine Kopie einer Rainbow-Tabelle halten würde, so konnte ich den Hash umkehren, wenn nötig)
Dictionary<int, Dictionary<int, Dictionary<int, float>>>
Also ich zu einem Speicher-Profiler ging, um zu sehen, welche Art von Größenreduzierung könnte ich bekommen. Zu meinem Schrecken fand ich tatsächlich, dass der String-Speicher tatsächlich kleiner war (sowohl normal als auch inklusive).
Das macht keinen intuitiven Sinn für mich. Selbst wenn der Compiler klug genug wäre, nur eine Kopie der Zeichenfolge zu speichern und eine Referenz zu verwenden, würde ich meinen, dass die Referenz ein Zeiger sein würde, der doppelt so groß ist wie ein int. Ich habe auch keine String.Intern
Methoden verwendet, so weiß ich nicht, wie dies erreicht worden wäre (ist auch String.Intern
die richtige Methode hier?)
Ich bin sehr verwirrt, was passiert unter der Haube, jede Hilfe würde geschätzt werden
Nichts besonderes wird unter der Haube getan. Entweder hat Ihre Internierungsstrategie nicht viel Redundanz beseitigt oder es gibt einen Fehler. Sie müssen Code schreiben. – usr
Vielleicht können Sie ein 'Dictionary>' verwenden, um die Verschachtelung loszuwerden. 'Dictionary' ist kein kleiner Typ. Verwenden Sie ein Strukturtupel. –
usr
"schoss SIGNIFIKANT." - verglichen mit was? (Beachten Sie, dass http: // stackoverflow.com/questions/20430157/Speicher-Verwendung-of-Dictionary-in-c-sharp kann als doppeltes Ziel für Ihre Frage verwendet werden, es sei denn, Sie klären, wie es nicht ist) –