我有点想法了。通过以下代码,我尝试安装一个大于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
如果有任何想法,我将不胜感激。如果缺少任何信息,我将尽快更新问题。
我也尝试过uint.MaxValue
答案 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[]