Важно понимать, что происходит, когда вы заполняете Hashtable. (Словарь использует Hashtable в качестве базовой структуры данных.)
Когда вы создаете новую Hashtable, .NET создает массив, содержащий 11 кодов, которые связаны списками записей словаря. Когда вы добавляете запись, ее ключ получает хешированный хэш-код, который сопоставляется с одним из 11 кодов, а запись (ключ + значение + хэш-код) добавляется к связанному списку.
В какой-то момент (и это зависит от коэффициента нагрузки, используемого при построении Hashtable), Hashtable определяет во время операции добавления, что он сталкивается с большим количеством конфликтов, и что начальные 11 кодов не являются достаточно.Таким образом, он создает новый массив ведер, который в два раза больше старого (не точно, количество ведер всегда просто), а затем заполняет новую таблицу из старой.
Итак, есть две вещи, которые вступают в игру с точки зрения использования памяти.
Во-первых, Hashtable часто использует вдвое больше памяти, чем в настоящее время, поэтому она может копировать таблицу во время изменения размера. Так что, если у вас есть Hashtable, который использует 1,8 ГБ памяти, и его нужно изменить, то на короткое время потребуется использовать 3,6 ГБ, и, ну, теперь у вас есть проблема.
Во-вторых, каждая запись в хэш-таблице содержит около 12 байт служебных данных: указатели на ключ, значение и следующую запись в списке, а также хэш-код. Для большинства применений эти накладные расходы незначительны, но если вы создаете Hashtable со 100 миллионами записей, то это примерно 1,2 ГБ накладных расходов.
Вы можете преодолеть первую проблему, используя перегруз конструктора словаря, который позволяет вам предоставить начальную емкость. Если вы укажете емкость, достаточную для хранения всех записей, которые вы собираетесь добавить, Hashtable не потребуется перестраивать, пока вы ее заполняете. Вы почти ничего не можете сделать со вторым.
3.5GB на 32-битных окнах. – UnkwnTech 2008-12-05 14:57:09
Я думал, что 3.5 ГБ - это объем физической памяти, который будет использовать вся система, но с 3 ГБ на каждый предел процесса. В любом случае, это меньше 5 :) – 2008-12-05 15:00:45
И ваше приложение должно быть настроено на любой процессор или x64, чтобы воспользоваться 64-разрядной системой. – 2008-12-05 15:55:36