У меня есть некоторый код, который я добавил вложенную словарю, в следующем форматеИспользование памяти словарей в C#
Dictionary<string, Dictionary<string, Dictionary<string, float>>>
После этого я заметил, что использование памяти моего приложения взлетела ЗНАЧИТЕЛЬНО. Эти словари вводятся в строки, которые часто повторяются, и есть много таких словарей, порядка 10 тысяч.
Чтобы решить эту проблему, я предположил, что повторяющиеся струны питаются значительным объемом памяти. Мое решение было хэш строки и использовать целое число вместо (я бы держать одну копию таблицы радуги, так что я мог бы обратить хэш при необходимости)
Dictionary<int, Dictionary<int, Dictionary<int, float>>>
Так что я пошел в профайлер памяти, чтобы увидеть, какого рода уменьшение размера я мог получить. К моему шоку я фактически обнаружил, что хранилище строк на самом деле меньше по размеру (как нормальное, так и включенное).
Это не меняет интуитивный смысл. Даже если компилятор достаточно умен, чтобы хранить только одну копию строки и использовать ссылку, я бы подумал, что ссылка будет указателем, который вдвое больше размера int. Я также не использовал никаких методов String.Intern
, поэтому я не знаю, как это было бы выполнено (также есть String.Intern
)?
Я очень смущен относительно того, что происходит под капотом, любая помощь было бы оценено
Ничего особенного не делается под капотом. Либо ваша стратегия интернирования не удаляла много избыточности, либо была ошибка. Вам нужно отправить код. – usr
Возможно, вы можете использовать словарь> ', чтобы избавиться от вложенности. «Словарь» - это не маленький тип. Используйте строковый кортеж. –
usr
"взлетел ЗНАЧИТЕЛЬНО". - по сравнению с чем? (Обратите внимание, что http: // stackoverflow.com/questions/20430157/memory-usage-of-dictionary-in-c-sharp можно использовать как дублирующую цель для вашего вопроса, если вы не уточните, как это не так) –