.Net Framework 4.5中的数组的MaxSize

时间:2014-08-10 03:28:17

标签: c# .net arrays garbage-collection .net-4.5

根据此网站hereMaxSize of an arraymore than 2GB个环境中可以x64,其可以容纳的实际元素是UInt32.MaxValue

所以,我已经使我的app.config像:

<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>

我的数组声明和初始化是:

int idsCount = 999999999;
long[] ids = new long[idsCount];  

远小于UInt32.MaxValue,但抛出了OutofMemory Exception 我有什么不对吗? 我的框架版本也是4.5

2 个答案:

答案 0 :(得分:7)

此失败的基本检查清单:

  • 当您运行附带调试器的程序时,请注意默认情况下启用的Visual Studio主机进程。它使用不同的 .config文件,yourapp.vshost.exe.config。通过禁用选项Project + Properties,Debug选项卡,快速消除此类事故。

  • 这仅在您的进程以64位模式运行时才有效,而不是新项目的默认值。 Project + Properties,Build选项卡,确保将Platform目标设置为AnyCPU,并选中“Prefer 32-bit mode”复选框。

  • 当您在那里时,单击“应用程序”选项卡并仔细检查“目标”框架设置。当然必须是4.5或更高。

  • Windows版本很重要,不同版本对进程的最大VM大小有不同的限制。查看this MSDN page并找到您的Windows版本和版本。例如,Windows 7 Home Basic遇到了麻烦,最多8 GB。

  • 64位模式下的大量分配可能会在提交失败时失败。提交是在操作系统的页面文件中保留空间的技术术语。它充当后备存储,以防您的大型阵列需要被分页以便为其他进程腾出空间。如果你的机器没有超过8千兆字节的RAM可用,那么几乎可以肯定会发生。您可能将大小限制设置得太低,或者操作系统无法快速增加页面文件以提供您所需的空间。马克·鲁西诺维奇在this blog post中表现得很好。

答案 1 :(得分:1)

C#long是64位,或8个字节。数组ids的大小为一个不到十亿个条目,每个条目8个字节。定义的数组将使用大约8GB。