Какое максимальное количество элементов в списке <T>? - PullRequest
32 голосов
/ 06 января 2010

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

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

EDIT:

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

Ответы [ 6 ]

57 голосов
/ 06 января 2010

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

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

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


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

1 голос
/ 17 октября 2011

На компьютере с архитектурой x64, используя .Net Framework 4 (не профиль клиента), компилируя для любого процессора в режиме выпуска, я мог бы перебрать всю доступную память. Мой процесс теперь 5,3 ГБ, и я использовал всю доступную память (8 ГБ) на моем ПК. На самом деле это Server 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;
    }
}
1 голос
/ 06 января 2010

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

edit: или нет, 2Gb - это предел! Это довольно интересно, BigArray, обойти ограничение размера массива 2 ГБ

0 голосов
/ 06 января 2010

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

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

0 голосов
/ 06 января 2010

Ограничение по списку составляет 2,1 миллиарда объектов или объем вашей памяти, который когда-либо ударил первым.

0 голосов
/ 06 января 2010

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

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

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

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

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