2010-01-05 2 views
30

Кто-нибудь знает, что такое максимальное количество элементов в списке?Каковы максимальные элементы в списке <T>?

Как увеличить размер? Или есть коллекция, которая берет бесконечные предметы? (Столько, сколько поместится в памяти, то есть)

EDIT:

я получить из исключения памяти при Count = 134217728 в список Интс. получил 3Gb оперативной памяти, из которых 2.2 используются. Звук нормальный

+0

@Tony - вы упоминаете (комментарии), что ваша память должна быть иссякает быстро ... что актуальной проблемы вы видя? –

+0

@Marc, отредактировал мое сообщение с проблемой –

+0

Обновлено ответ на ваше обновление –

ответ

53

List<T> будет ограничен максимальным размером массива, который составляет 2 ГБ (даже в x64). Если этого недостаточно, вы используете неправильный тип хранилища данных. Вы можете сэкономить много накладных расходов, запустив нужный размер, передав конструктору int.

Re your edit - с 134217728 x Int32, то есть 512 МБ. Помните, что List<T> использует алгоритм удвоения; если вы делаете капельное питание через Add (не выделяя все пространство в первую очередь), он попытается удвоить до 1 ГБ (на вершине 512 МБ вы уже держите остальное приложение, и, конечно же, CLR и библиотеки). Я предполагаю, что вы на x86, так что у вас уже есть ограничение 2GB за процесс, и вполне вероятно, что вы разложили свою «большую кучу объекта» до death при добавлении элементов.

Лично, да, это звучит о праве начать получать из памяти на данный момент.


Edit: в .NET 4.5, массивы размером более 2 Гб допускается, если переключатель <gcAllowVeryLargeObjects> включен. Предел тогда составляет 2^31 пункта. Это может быть полезно для массивов ссылок (по 8 байтов в x64) или массива больших struct.

+0

Вы имеете в виду 2^31 элемента, не так ли? –

+7

Нет, я имею в виду 2 ГБ памяти, наложенных CLR. Для ссылочных типов это означает (по x64) 8 байтов на ссылку, поэтому разделите ее еще несколько раз; -p –

+4

Интересным побочным эффектом вышесказанного является то, что ** в теории ** у вас может быть больше ссылок в массив в x86. На самом деле, на x86 вам никогда не удастся выделить массив, в котором большие * и * имеют место для любых полезных (и разных) объектов для его размещения ... В любом случае список/массив этого размера просто неправильно. –

1

Он ограничен только памятью.

Редактировать: или нет, 2Gb - это предел! Это довольно интересно, BigArray, getting around the 2GB array size limit

+0

, тогда моя память должна быстро разряжаться?!? –

+1

Не ограничиваясь памятью, существует жесткий предел из-за базовой поддержки массива. – Paolo

0

Список будет динамически расти, чтобы разместить столько предметов, сколько вы хотите включить, пока не превысите доступную память!

Из MSDN документации:

Если граф уже равен Capacity, емкость списка увеличивается автоматически перераспределить внутренний массив, и существующие элементы копируются в новый массив перед добавлением нового элемента.

Если граф меньше емкости, этот метод является операцией O (1). Если емкость должна быть увеличена для размещения нового элемента, этот метод становится операцией O (n), где n является Count.

+0

Я получаю исключение из памяти, когда Count = 134217728 в списке ints. получил 3Gb оперативной памяти, из которых 2.2 используются. Звучит нормально? –

+0

Похоже, вы используете половину гигабайта (это много ints * 4 байта/int32) только для этого списка. Вы, вероятно, подталкиваете границу. Вам НУЖНО считать, что так высоко? Вы можете инициализировать список без Count. – Sapph

+0

Счет просто так высок, но я могу решить этот другой путь. Спасибо за все ваши ответы. Это помогло мне! –

0

Лимит списка - это 2,1 миллиарда объектов или размер вашей памяти, который когда-либо попадает в первую очередь.

+0

Нет, это неправильно. Объект не может быть больше 2 ГБ, поэтому массив, содержащий фактические ссылки или значения, значительно ограничит это. –

+0

Не совсем, это зависит от типа хранимого объекта ... Лимит списка для 'int', например, составляет только 268435456 для 64-битных процессов. – Vlad

0

Интерфейс определяет Count и IndexOf и т. Д. Как тип int, поэтому я бы предположил, что int.MaxValue или 2,147,483,647 - это большинство предметов, которые вы могли бы вставить в список.

На самом деле возникает вопрос, почему на земле вам понадобится много, вероятно, будет более разумный подход к управлению данными.

1

На машине x64, используя .Net Framework 4 (не профиль клиента), компилируя для любого процессора в режиме Release, я мог бы пережевывать всю доступную память. Мой процесс теперь составляет 5,3 ГБ, и я потребляю всю доступную память (8 ГБ) на своем ПК. Это на самом деле сервер 2008 R2 x64.
я использовал пользовательский класс коллекции, основанный на CollectionBase для хранения 61,910,847 экземпляров следующего класса:

public class AbbreviatedForDrawRecord { 
    public int DrawId { get; set; } 
    public long Member_Id { get; set; } 
    public string FactorySerial { get; set; } 

    public AbbreviatedForDrawRecord() { 

    } 

    public AbbreviatedForDrawRecord(int drawId, long memberId, string factorySerial) { 
     this.DrawId = drawId; 
     this.Member_Id = memberId; 
     this.FactorySerial = factorySerial; 
    } 
} 
Смежные вопросы