C# Can';不要创建巨大的数组

C# Can';不要创建巨大的数组,c#,arrays,C#,Arrays,和许多其他程序员一样,我也参与了,和他们中的许多人一样,我喜欢的是挑战,所以我不会像阿特金那样比你做得快的评论,伙计,只是我的问题的一个解决方案,或者至少是一个提示 我需要创建大数组(比如size>int.MaxValue)。所以我浏览了很多网页,找到了一个。我以为我得救了,给我的App.config添加以下魔法: <configuration> <runtime> <gcAllowVeryLargeObjects enabled="true" />

和许多其他程序员一样,我也参与了,和他们中的许多人一样,我喜欢的是挑战,所以我不会像阿特金那样比你做得快的评论,伙计,只是我的问题的一个解决方案,或者至少是一个提示

我需要创建大数组(比如size>
int.MaxValue
)。所以我浏览了很多网页,找到了一个。我以为我得救了,给我的
App.config
添加以下魔法:

<configuration>
  <runtime>
    <gcAllowVeryLargeObjects enabled="true" />
  </runtime>
</configuration>
我怎样才能消除这个错误


仅供参考:我有

  • 16GB内存
  • SSD上的32GB内存映射(/paged?)
  • 64位已启用
从您的链接:

在应用程序配置文件中使用此元素可启用大小大于2 GB的阵列,但不会更改对象大小或阵列大小的其他限制:

对于字节数组和单字节结构数组,任何单个维度的最大索引为2147483591(0x7FFFFFC7),对于其他类型的数组,最大索引为2146435071(0x7FFFFF)

另见:

一个数组理论上最多可以有2147483647个元素,因为它使用int来索引


如果达到整数最大范围的边界,可以选择使用基于索引的
长数组

问题是使用
int
的不支持此功能。您可以通过使用手动创建它们


注意,你必须使用值。

如果你想避免创建巨大的数组,你应该考虑分区。您可以在中找到一个微妙的参考。第80页(如果在Chrome中查看,则为90页)。您仍然不能超过
2147483647
元素,但您可以接近那么多素数。请检查此项。我们有一个类似的讨论和解释,它指的是使用BigArray超过2 GB的限制Dude。。。错了。我知道现在需要大数组,但是你应该使用分区或其他技术来避免内存不足。
Array.CreateInstance(typeof(int),Int32.MaxValue)
throws
OutOfMemoryException
64位,
Array.CreateInstance(typeof(int),UInt32.MaxValue)
throws“大于2GB的阵列不受支持”,即使启用了
gcAllowVeryLargeObjects
设置…(.NET 4.5.3)。
void go(object sender, EventArgs eventArgs)
{
    t.Stop();
    ulong maxprime = 10;
    Stopwatch stopwatch = new Stopwatch();
    string s = String.Empty;
    while (maxprime < ulong.MaxValue)
    {
        stopwatch.Restart();
        richTextBox2.Text += Environment.NewLine + ("Max \t= " + maxprime.ToString("N0"));
        try
        {
            richTextBox2.Text += Environment.NewLine + ("Count \t= " + GetAllPrimesLessThan(maxprime).Count);
            richTextBox2.Text += Environment.NewLine + ("Time \t= " + stopwatch.Elapsed);
            richTextBox2.Text += Environment.NewLine + ("--------------------------------");
            maxprime *= 10;
            richTextBox2.Refresh();
        }
        catch (Exception exception)
        {
            s = exception.Message + "; Allocation size: " + (maxprime + 1).ToString("N0");
            break;
        }

    }
    if (!string.IsNullOrEmpty(s))
    {
        richTextBox2.Text += Environment.NewLine + s;
    }
    richTextBox2.Text += Environment.NewLine + ("Done.");
}

private static List<ulong> GetAllPrimesLessThan(ulong maxPrime)
{
    var primes = new List<ulong>() { 2 };
    var maxSquareRoot = Math.Sqrt(maxPrime);
    var eliminated = new bool[maxPrime + 1];

    for (ulong i = 3; i <= maxPrime; i += 2)
    {
        if (!eliminated[i])
        {
            primes.Add(i);
            if (i < maxSquareRoot)
            {
                for (ulong j = i * i; j <= maxPrime; j += 2 * i)
                {
                    eliminated[j] = true;
                }
            }
        }
    }
    return primes;
}
[...]
Max     = 1 000 000 000
Count   = 50847534
Time    = 00:00:15.3355367
--------------------------------
Max     = 10 000 000 000
Array dimensions exceeded supported range.; Allocation size: 10 000 000 001
Done.