2010-09-14 2 views
2

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

ответ

3

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

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

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

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

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

Edit:

памяти для таблица хэш распределяется таким образом: ответ

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 делает.

+0

Привет, может, пожалуйста, объясните мне, как память будет выделяться при инициализации? – TAdhav

+0

@Tanuja: Также обратите внимание, что в .NET есть другие классы словаря, мы специально говорим о 'System.Collections.Hashtable', который может быть не оптимальной для вас :) –

+0

.Net Reflector содержит ответы на многие жизненных вопросов. К сожалению, мины были повреждены с момента последнего обновления ... :) –

2

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

Согласно docs:

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

+0

Увидев ответ Мерлина, я действительно должен отменить свой «безграничный комментарий Hashtable», однако, если вы окажетесь в ситуации, когда вы размещаете 2 миллиарда + объектов в Hashtable, вам определенно нужен лучший метод хранения! –

+0

+1. Ссылка на соответствующие документы также весьма полезна :) –

Смежные вопросы