【问题标题】:Why I get OutOfMemoryException while trying to make an int array with size int.MaxValue为什么在尝试创建大小为 int.MaxValue 的 int 数组时出现 OutOfMemoryException
【发布时间】:2012-01-22 23:51:23
【问题描述】:

我正在尝试创建一个包含所有可能正整数的数组,我尝试了以下代码,它总是抛出内存不足异常。

private int[] AllIntegers()
{
    int[] all = new int[int.MaxValue];

    for (int i = 0; i < int.MaxValue; i++)
    {
        all[i] = i;
    }

    return all;
}

我做错了什么?或者这根本不可能?!

【问题讨论】:

  • 为什么需要这么大的数组?
  • 请记住,这样的阵列至少需要 8GB 内存。您运行的是 32 位还是 64 位系统?
  • 我使用的是 win 7 64 位,我有 6GB 内存。价值只是实验!

标签: c# arrays int


【解决方案1】:

正如其他人所说,您不能同时将所有这些信息保存在内存中。要获取所有自然数的列表,只需使用迭代器块,它一次只在内存中保存一个 int,加上方法状态信息:

static void Main (string[] args)
{
    foreach (int i in Program.NaturalNumbers ())
    {
        Console.WriteLine (i);
    }
}

public static IEnumerable<int> NaturalNumbers ()
{
    for (int i = 0; i <= int.MaxValue; i++)
    {
        yield return i;
    }
}

【讨论】:

    【解决方案2】:

    Int.MaxValue = 2,147,483,647, sizeof(int) = 4,所以你需要 8 GB 的内存来分配这个数组。该异常表明您的操作系统无法分配此数量的内存。

    == 更新 ==

    MSDN:

    当您在 64 位 Windows 上运行 64 位托管应用程序时 操作系统,您可以创建不超过 2 GB 的对象 (GB)。

    另见:BigArray<T>, getting around the 2GB array size limit

    【讨论】:

    • 没有。该错误意味着操作系统无法为进程分配那么多内存。用户可能安装了 8GB,但它们可能并非全部可寻址。
    • 即使他有那么多内存,我相信任何.NET对象都不能大于2GB。
    【解决方案3】:

    .NET 对象大小有一个硬性上限,它们不能大于 2 GB。即使在 64 位操作系统上。您的数组远远超出该大小。

    在 32 位操作系统上,您永远不会接近该限制,可用的最大连续虚拟内存块大约为 650 兆字节,无论大小。只有在启动时,这才迅速下山。这是地址空间碎片的副作用,由地址空间中的代码和堆混合引起。只要每次分配的大小足够小,您可以分配的内存总量接近 2 GB。不是你想要接近的东西,由于 OOM 导致的随机程序故障很难处理。

    【讨论】:

      【解决方案4】:

      如果您在 32 位操作系统上(在 64 位操作系统上这可能会更改),则整数为 4 个字节(32 位)。因此 int.MaxValue 是 2^31 (2^31 有符号,2^31 无符号),因此您尝试分配 2^31 整数的数组。将其乘以每个 4 个字节,您将获得 8589934592 个字节,即 8 GBytes。

      【讨论】:

        【解决方案5】:

        您正在尝试分配大约 4 * (2^32 -1) 字节的内存。这正好是 8GB,可能超出您的系统所能提供的或您的进程可以分配的容量。

        【讨论】:

          猜你喜欢
          • 2014-09-30
          • 2012-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-09-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多