Ne peut pas créer des tableaux de grande

Comme beaucoup d'autres programmeurs, je suis allé dans les nombres premiers, et comme beaucoup d'entre eux, ce que j'aime, c'est le défi, donc je ne suis pas à la recherche de commentaires, comme Atkin a fait cela plus vite que vous le mec, mais seulement une solution ou au moins une allusion à mon problème.

J'ai besoin de créer grand tableaux (comme la taille > int.MaxValue). Je suis donc allé à beaucoup de pages web et trouvé le gcAllowVeryLargeObjects Élément. Je pensais que j'ai été sauvé, ajoutez de la magie à mon App.config:

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

Mais il n'a pas travaillé. Voici le code que j'utilise :

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;
}

De sortie ce:

[...]
Max     = 1000000000
Count   = 50847534
Time    = 00:00:15.3355367
--------------------------------
Max     = 10000000000
Array dimensions exceeded supported range.; Allocation size: 10000000001
Done.

Comment puis-je me débarrasser de cette erreur?


Pour info: j'ai

  • 16 GO de ram;
  • 32 go de mémoire mappée(/paginé?) sur les SSD;
  • 64bits activé
Si vous voulez éviter de créer des tableaux de grande, vous devriez envisager de partitionnement. Vous pouvez trouver une référence subtile dans le NIST FIPS spec. Page 80 (qui est de 90 si la visualisation dans google Chrome). Vous ne pouvez toujours pas excéder 2,147,483,647 éléments, mais vous pouvez obtenir près que beaucoup de nombres premiers.
Check this out en ai un similaire de discussion et d'explication, il se réfère à l'utilisation BigArray<T> pour aller au-delà de la limite de 2 GO stackoverflow.com/questions/1087982/...
Dude... Mal bull. Je sais que maintenant, les grands tableaux sont requis, mais vous devez utiliser le partitionnement ou une autre technique pour ne PAS manquer DE MÉMOIRE.

OriginalL'auteur Thomas Ayoub | 2015-06-17