无法创建巨大的数组
本文关键字:数组 巨大 创建 | 更新日期: 2023-09-27 17:56:50
像许多其他程序员一样,我进入了素数,和他们中的许多人一样,我喜欢的是挑战,所以我不是在寻找像 Atkin 那样比你更快的评论,伙计,而只是对我的问题的解决方案——或者至少是一个提示。
我需要创建大数组(如大小> int.MaxValue
)。所以我去了很多网页,找到了gcAllowVeryLargeObjects Element one。我以为我得救了,在我的App.config
中添加以下魔法:
<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>
但它没有用。这是我使用的代码:
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.
如何摆脱此错误?
<小时 />仅供参考:我有
- 16GB 内存;
- 32GB 内存映射(/分页?
- 启用 64 位
从您的链接:
在应用程序配置文件中使用此元素可以启用大小大于 2 GB 的数组,但不会更改对象大小或数组大小的其他限制:
对于字节数组和单字节结构数组,任何单个维度中的最大索引为 2,147,483,591 (0x7FFFFFC7),对于其他类型的数组为 2,146,435,071 (0X7FEFFFFF)。
另请参阅 64 位 Windows 上 .NET 中数组的最大长度是多少:
理论上,数组最多可以有 2,147,483,647 个元素,因为它使用 int 进行索引。
如果达到整数最大范围的边界,则可以选择使用基于 long
-index 的数组。
问题是使用 int
的 C# 索引器属性不支持此功能。您可以使用 Array.CreateInstance(Type, long[])
手动构建它们。
请注意,您必须使用 Array.GetValue(long)
获取值。