C# 使用VS2010编译时,OutOfMemoryException是否仅在发布模式下?

C# 使用VS2010编译时,OutOfMemoryException是否仅在发布模式下?,c#,out-of-memory,C#,Out Of Memory,我的程序仅在发布模式下生成OutOfMemoryException,使用VS2010 C#编译器编译。崩溃发生时,它正在执行的操作实例化了1600个锯齿状数组,在下面循环的简化版本的第207页时它中断了: Double[][] arr = new Double[1600][]; int i = 0; while (i < 1600) { arr[i] = new Double[1000000]; i++; } Double[]arr=新的Double[1600][]; i

我的程序仅在发布模式下生成
OutOfMemoryException
,使用VS2010 C#编译器编译。崩溃发生时,它正在执行的操作实例化了1600个锯齿状数组,在下面循环的简化版本的第207页时它中断了:

Double[][] arr = new Double[1600][];
int i = 0;
while (i < 1600)
{
    arr[i] = new Double[1000000];
    i++;
}
Double[]arr=新的Double[1600][];
int i=0;
而(i<1600)
{
arr[i]=新的双精度[1000000];
i++;
}
基本上,考虑到一个Double需要消耗8个字节,仅这部分代码就可以生成约11.9GB。我没有那么多的RAM,但在年,他们回答我说CLR创建了一个交换内存,尽管它只能处理定义良好的内存量

当我在调试模式下编译程序时,它不会抛出
OutOfMemoryException
,相反,它会分配大量内存并保持程序运行。。。我没有足够的耐心来检查程序是否会顺利运行,尽管速度很慢,直到最后,因为它花费的时间太长了

因此:

  • 在发布模式下发生了什么而不是在调试模式下,导致程序在那里抛出异常
  • 考虑到我真的需要存储这么多的内存,因为这是一些科学计算产生的数据,你对处理这个问题有什么建议?(我正在考虑在计算过程中处理生成的数据,尽管在计算过程中会花费更多的时间,而不是生成大量数据然后进行处理…)

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

我猜您刚刚进入了“项目属性”>“构建”选项卡,并更改了“平台目标”。问题是,如果您只做了这些,那么这只会影响调试构建配置,因为屏幕顶部的“配置”过滤器默认为“活动(调试)”


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

请注意,在32位进程中,您可以寻址的最大托管内存量为2GB(如果您尚未编译到x64目标)。此外,发布模式通常更快,因此,可能只是因为您没有等待足够长的时间,调试生成中出现了
OutOfMemory
异常。。。很抱歉我的无知,但是像我的VS2010这样的x86程序可以编译成x64处理器不是很奇怪吗?(我是物理学家,不是计算科学家!)一点也不奇怪。它所需要做的就是为x64机器代码写入正确的字节。使用运行在完全不同操作系统(如Mac、Windows)上的编译器为新平台(如iPhone、Android、Windows Phone 7)编译应用程序并不罕见。