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

Максимальная длина байта []?

Я пытаюсь создать массив byte, длина которого UInt32.MaxValue. Этот массив представляет собой небольшую (ish) базу данных в памяти:

byte[] countryCodes = new byte[UInt32.MaxValue];

На моей машине, однако, во время выполнения я получаю a System.OverflowException с "Арифметической операцией, вызванной переполнением".

Какая сделка? Нужно ли использовать блок unsafe и malloc? Как я могу сделать это на С#?

4b9b3361

Ответ 1

Текущая реализация System.Array использует Int32 для всех внутренних счетчиков и т.д., поэтому теоретическое максимальное количество элементов Int32.MaxValue.

Также существует ограничение на максимальный размер на 2 ГБ на объект, установленный корпорацией Microsoft CLR.

Хорошее обсуждение и обходное решение здесь...

И несколько связанных, не совсем повторяющихся, вопросов и ответов здесь...

Ответ 2

В .NET 4.5 Максимальная длина экземпляра массива байтов: 2147483591 или 56 меньше, чем int.MaxValue. Найдено через:

for (int i = int.MaxValue; i > 0; i--)
{
    try
    {
        byte[] b = new byte[i];
        Console.Out.WriteLine("MaxValue: " + i);
        Environment.Exit(0);
    }
    catch (Exception ignored)
    {}
}

Ответ 3

Я бы не сделал этого в первую очередь. Почему вы хотите отложить эту память для этой базы данных в памяти? Разве вам не хотелось бы, чтобы какая-либо структура данных увеличивала размер по мере продвижения (например, List<int>)? Или (если это необходимо) использовать базу данных в памяти, например sqlite?