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

Каков максимальный размер, который может содержать массив?

В С# 2008, каков максимальный размер, который может содержать массив?

4b9b3361

Ответ 1

System.Int32.MaxValue

Предполагая, что вы имеете в виду System.Array, т.е. любой нормально определенный массив (int[] и т.д.). Это максимальное количество значений, которое может удерживать массив. Размер каждого значения ограничен только объемом памяти или виртуальной памяти, доступной для их хранения.

Этот предел применяется, поскольку System.Array использует Int32 в качестве индексатора, поэтому могут использоваться только допустимые значения для Int32. Кроме того, можно использовать только положительные значения (т.е. >= 0). Это означает, что абсолютная максимальная верхняя граница размера массива является абсолютной максимальной верхней границей значений для Int32, которая доступна в Int32.MaxValue и эквивалентна 2 ^ 31, или примерно 2 миллиарда.

В совершенно другой заметке, если вы беспокоитесь об этом, вероятно, вы используете много данных, правильно или неправильно. В этом случае я рассмотрю использование List<T> вместо массива, так что вы будете использовать столько памяти, сколько необходимо. Infact, я бы рекомендовал использовать List<T> или другой из общих типов коллекций все время. Это означает, что будет выделено столько памяти, сколько вы на самом деле используете, но вы можете использовать его так же, как обычный нормальный массив.

Другой сборник примечаний Dictionary<int, T>, который вы можете использовать как обычный массив, но будет заполняться только редко. Например, в следующем коде будет создан только один элемент, а не 1000, который создал массив:

Dictionary<int, string> foo = new Dictionary<int, string>();
foo[1000] = "Hello world!";
Console.WriteLine(foo[1000]);

Использование Dictionary также позволяет вам управлять типом индексатора и позволяет использовать отрицательные значения. Для абсолютного разрешенного массива максимального размера вы можете использовать Dictionary<ulong, T>, который предоставит больше потенциальных элементов, чем вы могли бы подумать.

Ответ 2

В MSDN это

По умолчанию максимальный размер массива 2 гигабайта (ГБ).

В 64-разрядной среде вы можете избежать ограничения размера, установив для атрибута enabled элемента конфигурации gcAllowVeryLargeObjects значение true в среде выполнения.

Однако массив будет по-прежнему ограничен общим количеством 4 миллиарда элементов.

См. здесь http://msdn.microsoft.com/en-us/library/System.Array(v = vs .110).aspx

Примечание. Здесь я фокусируюсь на фактической длине массива, предполагая, что у нас будет достаточно аппаратной ОЗУ.

Ответ 3

Этот ответ о .NET 4.5

Согласно MSDN, индекс для массива байтов не может быть больше 2147483591. Для .NET до 4.5 он также был пределом памяти для массива. В .NET 4.5 этот максимум один и тот же, но для других типов он может быть до 2146435071.

Это код для иллюстрации:

    static void Main(string[] args)
    {
        // -----------------------------------------------
        // Pre .NET 4.5 or gcAllowVeryLargeObjects unset
        const int twoGig = 2147483591; // magic number from .NET

        var type = typeof(int);          // type to use
        var size = Marshal.SizeOf(type); // type size
        var num = twoGig / size;         // max element count

        var arr20 = Array.CreateInstance(type, num);
        var arr21 = new byte[num];

        // -----------------------------------------------
        // .NET 4.5 with x64 and gcAllowVeryLargeObjects set
        var arr451 = new byte[2147483591];
        var arr452 = Array.CreateInstance(typeof(int), 2146435071);
        var arr453 = new byte[2146435071]; // another magic number

        return;
    }

Ответ 4

Вот ответ на ваш вопрос, который идет подробно: http://www.velocityreviews.com/forums/t372598-maximum-size-of-byte-array.html

Вы можете указать, какую версию .NET вы используете, и размер вашей памяти.

Вы будете привязаны к 2G, для вашего приложения, ограничьте это, так что это зависит от того, что находится в вашем массиве.

Ответ 5

Поскольку Length является int, я бы сказал Int.MaxValue

Ответ 6

Я думаю, что если вы не считаете VM, это Integer.MaxValue

Ответ 7

Я думаю, что это связано с пространством RAM (или, возможно, с виртуальной памятью) и абсолютным максимумом, ограниченным вашей версией ОС (например, 32-битным или 64-битным).