Подтвердить что ты не робот

Какие максимальные элементы в списке <T>?

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

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

EDIT:

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

4b9b3361

Ответ 1

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

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

Лично, да, это звучит по праву, чтобы начать получать out-of-memory на этом этапе.


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

Ответ 3

На машине x64, используя .Net Framework 4 (не профиль клиента), компилируя для любого процессора в режиме Release, я мог бы пережевывать всю доступную память. Мой процесс теперь составляет 5,3 ГБ, и я потребляю всю доступную память (8 ГБ) на своем ПК. Это на самом деле сервер 2008 R2 x64.
Я использовал собственный класс Collection на основе 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;
    }
}

Ответ 4

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

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

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

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

Ответ 5

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

Ответ 6

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

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