2011-05-26 68 views
2

我的程序只在发布模式下生成OutOfMemoryExcetion,使用VS2010 C#编译器进行编译。发生死机时被实例化1600个锯齿状排列,并在第207的下方循环的简化版本,当它打破了,它正在执行操作:仅在发布模式下使用VS2010编译时,OutOfMemoryException?

Double[][] arr = new Double[1600][]; 
int i = 0; 
while (i < 1600) 
{ 
    arr[i] = new Double[1000000]; 
    i++; 
} 

基本上,代码只是这一部分会产生〜11.9 GB,考虑到Double消耗8个字节。我没有那么多的RAM,但是在another question where I asked what happens when the RAM is over中,他们回答说CLR会创建一个交换内存,尽管它只能处理明确定义的内存量。

当我在DEBUG模式下编译我的程序时,它不会抛出OutOfMemoryException,而是分配大量内存并保持程序运行......我没有足够的耐心来检查程序是否会尽管运行缓慢,但运行平稳直到最后,因为它耗时过长。

所以:

  • 什么真的发生在调试模式没有,导致程序抛出一个异常有发行模式?
  • 考虑到我真的需要存储这么多的内存,因为它是由一些科学计算生成的数据,你有什么建议来处理这个问题? (我正在考虑在计算过程中处理生成的数据,但在计算本身时需要多一点时间,而不是生成大量数据然后处理它)
+1

你在64位吗? – khachik 2011-05-26 18:23:35

+0

请注意,您可以在32位进程中处理的最大管理内存量为2GB(如果您尚未编译为x64目标)。 – 2011-05-26 18:24:51

+2

另外,发布模式通常更快,所以它可能只是因为您没有足够长的时间来等待调试版本中出现OutOfMemory异常。 – 2011-05-26 18:25:57

回答

8

假设您创建您在Visual Studio 2010中的项目,其平台目标将默认为x86,即32位程序。我假设你已经将其更改为x64,或者你永远不能分配超过2GB的地址空间。

我的猜测是,你刚刚去项目属性>生成选项卡,并更改“平台目标”。问题是,如果这就是你所做的一切,那只会影响你的Debug构建配置,因为屏幕顶部的“配置”过滤器默认为“活动(调试)”。

将该过滤器框更改为“发布”以查看您的发布版本设置。您还需要在此处将“平台目标”更改为“x64”。

+0

就是这样......对不起我的无知,但并不奇怪像我的VS2010这样的x86程序可以编译为x64处理器吗? (我是物理学家,而不是计算科学家!) – Girardi 2011-05-29 23:13:13

+0

一点也不奇怪。它所需要做的就是为x64机器码编写正确的字节。使用在完全不同的操作系统(例如Mac,Windows)上运行的编译器为新平台(例如iPhone,Android,Windows Phone 7)编译应用程序并不少见。 – 2011-05-31 01:25:09

相关问题