【问题标题】:What is capping out Array size in C#?什么是 C# 中的数组大小上限?
【发布时间】:2015-05-16 13:55:54
【问题描述】:

我想创建两个 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 的数组,则不会抛出异常。

为什么?

【问题讨论】:

  • 不,这个问题在您发送的链接中没有答案。 200M 个整数大约是 800MB。为什么这个尺寸适合第一个对象,但不适合第二个对象?
  • 这个问题绝对不是关于单个对象的大小,而是多个对象的总大小。重新打开。
  • @PetSerAl - 显然是 32 位的。 x64 将在大约 500M 的单次分配中失败,32 位在尝试找到 2 个 800Mb 的连续块时失败(这非常困难),通常一个还可以。

标签: c# arrays


【解决方案1】:

这台机器有 12GB 的 RAM。

影响程序的速度(取决于有多少空闲),但物理内存大小对分配成功或失败没有影响。这取决于可用的地址空间。

如果您正在编译为 32 位,尤其是 you are not using the /LARGEADDRESSAWARE option,那么您将只能分配少数大对象,因为它们必须适合单个 2GB 地址空间,并且该空间被分解通过 DLL 和其他分配。

如果您确实需要这么大的对象,最好使用 64 位。对于 32 位程序,您可以通过将对象分成更小的块来部分解决此问题,从而增加找到足够大的地址空间空闲区域的机会。

VS 2013 中 C# 控制台应用程序的默认设置是“AnyCPU”,带有“首选 32 位”。

您可以在项目属性 -> 构建选项卡上更改此设置。

【讨论】:

  • 请务必注意,系统空间必须是连续的,因此即使 Windows 资源监视器显示 RAM 中有 2 GB 的可用内存,它也可能不是连续内存。
  • @Xantix:当我说“空间被破坏”时,我指的是连续性。如果您正在查看可用 RAM,那么您完全错过了这一点,因为分配失败是由缺少(连续)地址空间引起的,而不是缺少 RAM。如果缺少 RAM,则使用交换文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
  • 2020-10-09
相关资源
最近更新 更多