我想创建两个200M int元素数组。像那样:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Arr
{
class Program
{
static void Main(string[] args)
{
int Min = 0;
int Max = 10;
int ArrSize = 200000000;
int[] test2 = new int[ArrSize];
int[] test3 = new int[ArrSize];
Console.ReadKey();
}
}
}
但是,在VS2013下,我发现内存不足异常,黄色箭头指向int[] test3 = new int[ArrSize];
行。这台机器有12GB的RAM。
如果我将元素数量减少到150M,则不会抛出任何异常。
如果我只初始化一个大小为200M的数组,则不会抛出任何异常。
为什么?
答案 0 :(得分:6)
机器有12GB的RAM。
会影响程序的速度(取决于程序的速度是多少),但物理内存大小对分配成功或失败没有影响。这取决于可用的地址空间。
如果您正在编译为32位,尤其是you are not using the /LARGEADDRESSAWARE
option,那么您将只能分配少量大型对象,因为它们必须适合单个2GB地址空间,并且该空间是由DLL和其他分配分解。
如果您确实需要大型对象,那么使用64位是个好主意。对于32位程序,您可以通过将对象分成更小的块来部分解决这个问题,从而增加找到足够大的空闲区域空间的机会。
VS 2013中C#控制台应用程序的默认设置为“AnyCPU”,“首选32位”。
您可以在项目属性中更改此设置 - >构建标签。