Максимальная длина байта []? - PullRequest
20 голосов
/ 15 октября 2010

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

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

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

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

Ответы [ 4 ]

28 голосов
/ 15 октября 2010

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

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

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

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

8 голосов
/ 21 августа 2013

В .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)
    {}
}
1 голос
/ 29 декабря 2018

Максимальная длина байтового массива: 2130702268. Например:

var countryCodes = new byte[2130702268];
1 голос
/ 15 октября 2010

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

...