Согласно исходному коду MemoryStream класса вы не сможете хранить более 2 ГБ данных в одном экземпляре этого класса.
Причина этого заключается в том, что максимальная длина потока установлена на Int32.MaxValue
, а максимальный индекс массива установлен на 0x0x7FFFFFC7
, что составляет десятичное число 2,147,783,591 (= 2 ГБ).
Фрагмент MemoryStream
private const int MemStreamMaxLength = Int32.MaxValue;
Массив фрагментов
// We impose limits on maximum array lenght in each dimension to allow efficient
// implementation of advanced range check elimination in future.
// Keep in sync with vm\gcscan.cpp and HashHelpers.MaxPrimeArrayLength.
// The constants are defined in this method: inline SIZE_T MaxArrayLength(SIZE_T componentSize) from gcscan
// We have different max sizes for arrays with elements of size 1 for backwards compatibility
internal const int MaxArrayLength = 0X7FEFFFFF;
internal const int MaxByteArrayLength = 0x7FFFFFC7;
Вопрос Более 2 ГБ управляемой памяти уже давно обсуждался на форуме Microsoft и содержит ссылку на статью в блоге о BigArray, позволяющую обойти ограничение размера массива 2 ГБ там.
Обновление
Я предлагаю использовать следующий код, который должен иметь возможность выделить более 4 ГБ в сборке x64, но потерпит неудачу <4 ГБ в сборке x86 </p>
private static void Main(string[] args)
{
List<byte[]> data = new List<byte[]>();
Random random = new Random();
while (true)
{
try
{
var tmpArray = new byte[1024 * 1024];
random.NextBytes(tmpArray);
data.Add(tmpArray);
Console.WriteLine($"{data.Count} MB allocated");
}
catch
{
Console.WriteLine("Further allocation failed.");
}
}
}