HashSet
увеличивается вдвое. Поэтому, когда у вас есть 23 997 907 элементов в списке и вы пытаетесь добавить следующий, он пытается удвоить размер своего резервного массива. И это распределение приводит к превышению доступной памяти. Я предполагаю, что вы используете это в 32-битной системе, потому что в 64-битной системе HashSet<object>
может содержать более 89 миллионов элементов. Ограничение составляет около 61,7 миллиона элементов в 32-разрядной среде выполнения.
Что вам нужно сделать, это предварительно выделить HashSet
для хранения столько элементов, сколько вам нужно. К сожалению, нет прямого способа сделать это. HashSet
не имеет конструктора, который предварительно выделяет его с заданной емкостью.
Однако вы можете создать List
, использовать его для инициализации HashSet
, а затем вызвать Clear
на HashSet
. В итоге вы получаете HashSet
, в котором нет предметов, но вместимость которого равна максимальной, которую вы запрашивали. Я показал, как это сделать, в записи блога: Подробнее о размерах коллекций .NET. а>.
Ограничения на размер HashSet
связаны с ограничением в два гигабайта в .NET. Ни один объект не может быть больше двух гигабайт. На самом деле это число немного меньше из-за накладных расходов на выделение.
person
Jim Mischel
schedule
27.12.2011