.NET: Масштабируемость универсального словаря - PullRequest
3 голосов
/ 24 октября 2009

Я использую Dictionary<> для хранения базилиона предметов. Можно ли предположить, что, пока в памяти сервера достаточно места для размещения этих миллиардов элементов, я получу почти O (1) извлечение элементов из него? Что я должен знать об использовании универсального словаря в качестве огромного кэша, когда важна производительность?

РЕДАКТИРОВАТЬ: я не должен полагаться на реализации по умолчанию? Что делает для хорошей функции хеширования?

Ответы [ 4 ]

12 голосов
/ 24 октября 2009

Это зависит, в основном, от того, насколько хороши функции хеширования, поддерживаемые вашими «bazillion items» - если их функция хеширования не является превосходной (так что возникает много конфликтов), ваша производительность будет ухудшаться с ростом словаря. 1001 *

8 голосов
/ 24 октября 2009

Вы должны измерить это и выяснить. Вы тот, кто знает точное использование вашего словаря, поэтому вы можете измерить его, чтобы убедиться, что он соответствует вашим потребностям.

Несколько советов: в прошлом я проводил анализ производительности больших структур словарей и обнаружил, что производительность действительно снижается, так как словарь становится чрезвычайно большим. Но это, казалось, ухудшалось здесь и там, не последовательно на каждой операции. Я проделал большую работу, пытаясь проанализировать алгоритмы хэширования и т. Д., Прежде чем ударить себя по лбу. сборщик мусора становился медленнее, потому что у меня было так много живого рабочего набора; словарь был таким же быстрым, как и всегда, но если какая-то коллекция была запущена, то это поглощало мои циклы.

Вот почему важно не проводить тестирование производительности в нереальных тестовых сценариях; чтобы выяснить, какова реальная производительность вашего словаря базилиона элементов, ну, это будет основано на многих вещах, которые не имеют никакого отношения к вашему словарю, например, сколько запуска коллекции происходит в течение остальной части вашего программа и когда.

3 голосов
/ 24 октября 2009

Да, у вас будет O (1) раз доступа. Фактически, чтобы быть педантичным g , это будет точно O (1). Вы должны убедиться, что все ваши объекты, которые используются в качестве ключей, имеют хорошую реализацию GetHashCode и, вероятно, должны переопределять Equals.

Изменить, чтобы уточнить: В действительности время доступа будет тем медленнее, чем больше у вас будет элементов, если вы не сможете обеспечить "идеальную" хеш-функцию.

1 голос
/ 24 октября 2009

Да, у вас будет около O (1) независимо от того, сколько объектов вы поместите в Словарь. Но чтобы словарь работал быстро, ваши ключевые объекты должны обеспечивать достаточную реализацию GetHashCode, поскольку словарь использует хеш-таблицу внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...