【问题标题】:How to create an array with more then 300 milions of data [duplicate]如何创建一个包含超过 3 亿条数据的数组 [重复]
【发布时间】:2014-04-15 22:06:51
【问题描述】:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace testes
{
    class Program
    {
        static void Main(string[] args)
        {
            Int64[] a = new Int64[300000000];
            a[0] = 10;

        }
    }
}

运行此代码后,我收到 System.OutOfMemoryException,但我的计算机有 8 千兆的可用内存。你能帮帮我吗?

我是 C# 的初学者。我已经将编译目标 cpu 更改为 x64,认为只有这样就足够了。 谢谢 卢克

【问题讨论】:

标签: c# memory-management out-of-memory


【解决方案1】:

http://msdn.microsoft.com/en-us/library/ms241064(v=vs.110).aspx

默认情况下,当您在 64 位 Windows 操作系统上运行 64 位托管应用程序时,您可以创建不超过 2 GB 的对象。但是,在 .NET Framework 4.5 中,您可以增加此限制。有关详细信息,请参阅 gcAllowVeryLargeObjects 元素。

要么拆分你的数组,要么把它放在你的配置中:

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

【讨论】:

    【解决方案2】:

    您的第一个错误是将数据类型设置为Int64。您拥有的整数越多,您希望它们占用的空间就越少。

    其次,您甚至无法存储 3 亿个字符。这太大了。当您要对如此庞大的数据进行操作时,您有两种选择:

    1. 您可以创建一个数据库并对其进行操作。
    2. 您可以将数据写入文本文件并读取整数 随时需要。

    这两种方法都有点复杂,尤其是您需要特殊的方法来随机访问文本文件中的整数。例如您必须编写一个方法来迭代所有行,直到达到您想要的整数等。

    我对你的建议是“使用数据库”。

    编辑:您的物理内存与分配给编译器的内存不同。此外,3 亿个 64 位数据太大而无法存储为一个块。

    【讨论】:

    • 也许 OP 使用 Int64 是因为那是他们需要的数据类型?我有 300,000,000 个 int64(8 字节值)作为 2.24 GB。您如何判断“3 亿 64 位数据比 8 GB 大得多”?不是。
    • @spender 我的错。我错过了一个小数,计算为 22.4GB。我现在更正了。
    猜你喜欢
    • 2017-01-25
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2014-08-13
    • 2015-12-24
    • 2021-03-02
    相关资源
    最近更新 更多