Как и многие другие программисты, я вошел в primes, и, как и многие из них, мне нравится вызов, поэтому я не ищу комментариев, таких как Atkin сделал это быстрее, чем вы, чувак , а просто решение - или, по крайней мере, намек - на мою проблему.Невозможно создать огромные массивы
Мне нужно создать большие массивы (как размер>int.MaxValue
). Поэтому я пошел на множество веб-страниц и нашел gcAllowVeryLargeObjects Element. Я думал, что я был спасен, добавьте следующую магию к моему 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.
Как я могу избавиться от этой ошибки?
FYI: У меня
- 16GB оперативной памяти;
- Память 32 ГБ отображается (/ paged?) На SSD;
- 64бит включен
Если вы хотите избежать создания огромных массивов, вам следует рассмотреть раздел. Вы можете найти тонкую ссылку в спецификации [NIST FIPS] (http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf). Страница 80 (это 90, если просмотр в Chrome). Вы по-прежнему не можете превышать элементы «2 147 483 647», но вы можете приблизиться к множеству простых чисел. –
Проверьте это, чтобы обсудить и объяснить это, это относится к использованию BigArray, чтобы выйти за пределы 2 ГБ. http://stackoverflow.com/questions/1087982/single-objects-still-limited-to-2-gb- in-size-in-clr-4-0 –
Чувак ... Неверный бык. Я знаю, что теперь требуются большие массивы, но вы должны использовать разделение или другую технику, чтобы НЕ ВЫПОЛНИТЬ ПАМЯТЬ. – dr4cul4