gcAllowVeryLargeObjects已设置,但仍导致System.ArgumentOutOfRangeException

时间:2019-07-20 10:55:14

标签: c# arrays gcallowverylargeobjects

我有点想法了。通过以下代码,我尝试安装一个大于2GB的字节数组:

var b = Array.CreateInstance(typeof(byte), uint.MaxValue);

每次都会对System.ArgumentOutOfRangeException消息造成arrays larger then 2GB are not supported的排斥。

我的App.config当前为:

<?xml version="1.0" encoding="utf-8" ?>
   <configuration>
      <startup> 
         <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.7.2"/>
      </startup>
      <runtime>
         <gcAllowVeryLargeObjects enabled="true" />
      </runtime>
   </configuration>

该项目的目标平台还为x64

如果有任何想法,我将不胜感激。如果缺少任何信息,我将尽快更新问题。

更新1

我也尝试过uint.MaxValue

2 个答案:

答案 0 :(得分:0)

仅出于完整性检查的目的,您尝试分配9.223 EB(艾字节)的连续内存块,即9.223×10 ^ 9 GB(千兆字节)。很简单,但是您甚至无法在x64机器上执行此操作,因为无论如何都会使用一些内存,这将是最大的。

相反,请尝试使用动态增长的列表:

var b = new List<byte>();

编辑:

对于字节数组和单字节结构数组,任何单个维度的最大索引为2,147,483,591(0x7FFFFFC7),对于其他类型,最大索引为2,146,435,071(0X7FEFFFFF)。 -来源:https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/runtime/gcallowverylargeobjects-element

gcallowverylargeobjects-element的作用是可以定义超过2Gb的多维数组,并且在其他数据类型的情况下,可以分配2146435071 * data_type_size内存。例如int32包含4个字节,因此它将是8.586 GB(千兆字节)。

答案 1 :(得分:0)

一维数组不能包含多于int.MaxValue个元素,即使它们在<gcAllowVeryLargeObjects中可以大于2gb(例如new int[int.MaxValue / 2]为〜4gb)。要解决此问题,您必须创建二维数组,或使用其他类型,例如

public struct BytePair
{
    public byte First, Second;
}

,然后创建大小为BytePair[]一半的byte[]