1

我有点没有想法。使用以下代码,我尝试实例化一个大于 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

4

2 回答 2

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(千兆字节)。

于 2019-07-20T11:05:17.197 回答
0

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

public struct BytePair
{
    public byte First, Second;
}

然后创建一个BytePair[]相当于一半大小byte[]

于 2019-07-20T14:07:44.790 回答