64位系统上的内存不足异常

5

我正在尝试创建以下数组

int numOfArrays = 50000;
int lengthOfArrays = 13500;

long[,] unsortedNumbers = new long[numOfArrays,lengthOfArrays];

但是我一直收到内存溢出异常。 我的目标是x64,我相信我已设置了large-address-aware标志(请参见图片),但仍然出现错误。奇怪的是,我在同一个程序中有一个消耗16GB RAM的列表而没有任何问题。

系统:

64GB RAM

硬盘上有100GB可用空间。


哪个框架?在FW2.0和FW4.0中,大对象的内存处理存在差异。 - Ondrej Svejdar
.net 4客户端框架和尝试使用.net 4。 - Hans Rudel
首先,请查看https://dev59.com/jmoy5IYBdhLWcg3wa9bf。再看一下https://dev59.com/sXRB5IYBdhLWcg3wAjNH和https://dev59.com/km865IYBdhLWcg3wduWH。同时尝试使用System.Int32.MaxValue,正如您在https://dev59.com/FXM_5IYBdhLWcg3wZSXX中所看到的那样。 - Mihai8
@Anirudh - long类型占用8个字节,8 * 50000 * 13500大约需要5GB的空间。 - Ondrej Svejdar
1个回答

12

在.NET运行时中,32位和64位进程都存在对象大小的2Gig限制。

但是在.NET 4.5中,你可以通过gcAllowVeryLargeObjects来增加在64位进程中运行的.NET代码的限制。

如果满足以下条件,则你的.NET代码将以64位方式运行:

  • 你的平台目标为"x64"
  • 你使用.NET 4,并且你的平台目标为"AnyCPU",并且你正在64位操作系统平台上运行
  • 你使用.NET 4.5,并且你的平台目标为"AnyCPU",并且你已经关闭了"prefer 32-bit"选项,并且你正在64位操作系统平台上运行

你正在分配:

50000 * 13500 * 8 = 5400000000字节= 5.029 GB

如果你不能使用.NET 4.5,那么根据你的使用情况,你可以使用BigArray代替:


+1,但值得注意的是,“数组中的最大元素数量为UInt32.MaxValue。”请参阅http://msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx。 - ken2k
那么一个列表 <object>,其中每个对象都持有这些数组之一,就可以解决这个问题了? - Hans Rudel
3
@Anirudh (50000135008)/(1024^3) = 5GB@Anirudh(50000×13500×8)/(1024^3)= 5GB - ken2k
1
请返回翻译后的文本:或者List<object>本身是否属于对象类别,因此具有这个2G的最大大小限制? - Hans Rudel
1
@colinsmith 也许你可以指出这个限制是针对对象而非程序内存消耗的。 - Cédric Bignon
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接