【问题标题】:Out of memory exception on 64bit64位内存不足异常
【发布时间】:2013-07-22 10:47:12
【问题描述】:

我正在尝试创建以下数组

int numOfArrays = 50000;
int lengthOfArrays = 13500;

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

但我一直在输出内存异常。我的目标是 x64,我相信我设置了大地址感知标志,见图片,但我仍然收到错误。奇怪的是,我在同一个程序中有一个列表,它消耗 16gig 的 ram 没有任何问题。

系统:

64g 内存

100gig 高清免费。

【问题讨论】:

标签: c# c#-4.0 64-bit out-of-memory


【解决方案1】:

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

但在 NET 4.5 中,您可以使用 gcAllowVeryLargeObjects 增加在 64 位进程中运行时运行的 NET 代码的限制。

如果出现以下情况,您的 NET 代码将以 64 位运行:

  • 您的平台目标显示“x64”
  • 您使用的是 NET 4,并且您的平台目标显示为“AnyCPU”,并且您在 64 位操作系统平台上运行
  • 您使用的是 NET 4.5,并且您的平台目标显示“AnyCPU” 并且您已关闭/取消勾选“首选 32 位”,并且您在 64 位操作系统平台上运行

您正在分配:

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

如果您没有使用 NET 4.5 的奢侈,那么根据您的使用场景,您可以改用 BigArray

【讨论】:

  • +1,但值得注意的是“数组中元素的最大数量是 UInt32.MaxValue”。见msdn.microsoft.com/en-us/library/hh285054(v=vs.110).aspx
  • 所以一个列表,其中每个对象都包含其中一个数组,可以解决这个问题吗?
  • @Anirudh (50000*13500*8)/(1024^3) = 5GB
  • 见上面的评论 + 或者 List 本身是否属于一个对象的类别,因此有这个 2gig 的最大大小限制?
  • @colinsmith 也许你可以指出这个限制是针对对象的。不在程序内存消耗上。
猜你喜欢
  • 2012-07-15
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多