【问题标题】:How can I declare a 2D integer array of size 100000 by 100000 in C#?如何在 C# 中声明大小为 100000 x 100000 的二维整数数组?
【发布时间】:2015-07-25 03:04:11
【问题描述】:

我使用 VS 2013 进行了尝试。我收到一个异常说“在 byteArray.exe 中发生了类型为 'System.OutOfMemoryException' 的未处理异常”(我使用 byte 而不是 int) . .

static void Main(string[] args)
  {
  byte[,] a = new byte[100000, 100000];
  for(int i=0;i<100000;i++)
        {
            for(int j=0;j<100000; i++)
            {
                Console.Write(0+" ");
            }
        }
    }

【问题讨论】:

  • 正如它所说。你没有足够的内存来存储这么大的数组。
  • 你真的有空闲的 10GB RAM 来完成这项任务吗?
  • 不。我只有 3GB RAM(总计)。它需要 10GB 吗?
  • @VikasThakur 您应该计算一下您的程序将占用多少 RAM。 (100'000 ^ 2) / (1'024 ^ 3) 以 GB 为单位。
  • 我现在明白了。非常感谢

标签: c# arrays memory-management multidimensional-array out-of-memory


【解决方案1】:

100,000 乘以 100,000 字节将需要大约 10GB 的空间,您不太可能在 32 位操作系统中分配它,您的地址空间仅限于 4G(还有 other 也会用到它的东西)。

即使你的堆可以处理这个问题(在 64 位操作系统中也可能),你也应该仔细考虑一下。

相反,您可能需要考虑其他选项,例如磁盘存储,仅在需要时引入所需的内容。这可以像内存映射一个 10G 文件并让操作系统根据需要处理它与磁盘之间的分页一样简单。

或者,根据您的实际需求(而不是满足这些需求的特定实现),可能还有其他方法。

【讨论】:

    【解决方案2】:

    如果使用 .net 4.5 或更高版本的视觉工作室。您可以将程序构建平台目标设置为 x64。

    然后在您的 App.Config 文件中包含以下内容。

    <runtime>
        <gcAllowVeryLargeObjects enabled="true"/>
    </runtime>
    

    上面将允许您使用这样的锯齿状数组,是的,它将使用 10gb 的内存。

            byte[][] array = new byte[100000][];
            for (int i = 0; i < array.Length; i++)
            {
                array[i] = new byte[100000];
            }
    

    编辑:正如 paxdiablo 所说,这不应该被使用,因为应该有更好的方法来完成你正在尝试的事情。此外,您需要一个 64 位操作系统才能运行上述内容。

    【讨论】:

    • @paxdiablo 是的,我认为 x64 平台目标很明显。但你是对的,我应该在上面说。我在上面添加了谢谢pax。
    • 像这样单独分配每一行在局部性方面非常糟糕,而且它也比单个二维数组慢
    • @LưuVĩnhPhúc 是什么让您认为分配数组序列会导致与一个长数组显着不同的内存布局(以及因此的局部性)?
    猜你喜欢
    • 2015-02-11
    • 1970-01-01
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-01
    • 1970-01-01
    • 2015-05-14
    相关资源
    最近更新 更多