Я слышал от кого-то, что максимальный размер массива в .NET составляет 4 ГБ? Просто интересно, правда ли это. Вы бы не мечтали сделать это в 32-битной .NET, но в 64-битной системе с 12 ГБ ОЗУ, может быть, просто, может быть, вы захотите это сделать. :-)
Какова максимальная длина массива в .NET в 64-разрядной версии Windows?
Ответы (3)
Теоретически массив может содержать не более 2 147 483 647 элементов, поскольку для индексации используется тип int. Фактический предел немного ниже, чем этот, в зависимости от типа, содержащегося в массиве.
Однако в .NET CLR существует ограничение на максимальный размер одного объекта в 2 ГБ, даже в 64-разрядной версии. Это было сделано по дизайну.
Вы можете легко создать реализацию IList<T>
, которая внутренне хранит несколько массивов и позволяет вам выйти за пределы ограничения на один объект в 2 ГБ, но в самой структуре его нет.
Однако, как правило, это не является реальной проблемой. В большинстве случаев у вас будут массивы, указывающие на большие классы, поэтому массив просто содержит ссылки. Это означало бы, что ваш массив может эффективно указывать на много-много ГБ памяти, но сам массив не может быть >2 ГБ.
Обратите внимание, что начиная с .NET 4.5 доступен новый параметр, в котором 64-разрядные приложения могут подписаться: gcAllowVeryLargeObjects. С помощью этого нового набора параметров можно получить UInt32.MaxValue
(4 294 967 295) элементов в многомерном массиве, хотя одномерный массив по-прежнему ограничен 2 146 435 071 элементом (2 147 483 591 для однобайтовых массивов или массивов структур, не содержащих ничего, кроме байта). ).
Новые правила с этой опцией:
- Максимальное количество элементов в массиве — UInt32.MaxValue.
- Максимальный индекс в любом отдельном измерении равен 2 147 483 591 (0x7FFFFFC7) для байтовых массивов и массивов однобайтовых структур и 2 146 435 071 (0X7FEFFFFF) для других типов.
- Максимальный размер строк и других объектов, не являющихся массивами, не изменился.
new ulong[333222111]
не вызовет проблем с размером индекса, но превышает лимит в 2 ГБ (поэтому нужен gcAllowVeryLargeObjects
). То же самое с new string[333222111]
(ссылочный тип).
- person Jeppe Stig Nielsen; 18.12.2013
Boolean
(bool
) в логическом массиве занимает целый байт, а не только 1/8 байта.
- person Jeppe Stig Nielsen; 18.12.2013
new float[2146435071]
работает, new float[2146435071 + 1]
нет, но максимальный индекс new float[2146435071]
равен 2146435070
(и под словом index в массивах Microsoft всегда подразумевает индекс, а не длину, см. различные методы класса Array
)
- person xanatos; 29.12.2020
В версиях .NET до 4.5 максимальный размер объекта составляет 2 ГБ. Начиная с версии 4.5, вы можете выделять более крупные объекты, если gcAllowVeryLargeObjects включен. Обратите внимание, что ограничение для string
не затрагивается, но «массивы» должны охватывать и «списки», поскольку списки поддерживаются массивами.
Максимальный размер любого объекта в .NET составляет 2 ГБ.
Это, конечно, накладывает жесткий предел на то, насколько большим вы можете сделать необработанный массив.
Вы можете создать «массив массивов» (и даже создать свой собственный индексатор для доступа к ним, как если бы это был один непрерывный массив) настолько большим, насколько вам нравится, если вы определите для него свой собственный класс.