Максимальная длина байта []?
Я пытаюсь создать массив byte
, длина которого UInt32.MaxValue
. Этот массив представляет собой небольшую (ish) базу данных в памяти:
byte[] countryCodes = new byte[UInt32.MaxValue];
На моей машине, однако, во время выполнения я получаю a System.OverflowException
с "Арифметической операцией, вызванной переполнением".
Какая сделка? Нужно ли использовать блок unsafe
и malloc
? Как я могу сделать это на С#?
Ответы
Ответ 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?