根据此网站here,MaxSize of an array
在more 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
答案 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。