Как распределяется память для Hashtable? - PullRequest
2 голосов
/ 14 сентября 2010

Когда инициализируется хеш-таблица, как для нее выделяется память?Когда мы добавляем в него новых членов, как расширяется память, используемая хеш-таблицей?Случалось ли когда-нибудь, что хеш-таблица не может хранить объекты после фиксированного размера?

Ответы [ 2 ]

3 голосов
/ 14 сентября 2010

Вы можете использовать .NET отражатель , чтобы узнать.

System.Collections.Hashtable содержит некоторые жесткие ограничения:

double num = ((float) capacity) / this.loadFactor;
if (num > 2147483647.0)
{
    throw new ArgumentException(Environment.GetResourceString("Arg_HTCapacityOverflow"));
}

Также имейте в виду значение int.MaxSize для емкости (я думаю, что емкость может быть такой же, как и количество сегментов, в зависимости от коэффициента загрузки).

Однако, если вы достигаете этого предела размера, возможно, вы захотите изучить более эффективные методы хранения, чем объект CLR в хэш-таблице в памяти ...

Изменить:

Память для хеш-таблицы распределяется следующим образом:

int num2 = (num > 11.0) ? HashHelpers.GetPrime((int) num) : 11;
this.buckets = new bucket[num2];

[StructLayout(LayoutKind.Sequential)]
private struct bucket
{
    public object key;
    public object val;
    public int hash_coll;
}

См. Ответ Уилла о том, что HashHelpers.GetPrime делает.

2 голосов
/ 14 сентября 2010

Hashtable управляет своим размером - так что вы не столкнетесь с ситуацией, когда вы не можете вставить объект, если у вас не хватает памяти (или если вы, конечно, пытаетесь вставить дубликат ключа).

Согласно документам :

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

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