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é
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
Vous devez vous connecter pour publier un commentaire.
À partir de votre lien:
Voir aussi Quelle est la longueur maximale d'un tableau .NET sur Windows 64 bits:
OriginalL'auteur CodeCaster
Si vous frappez les limites de l'entier max de la gamme, vous pouvez choisir d'utiliser un
long
-indice de tableau.Le problème est que ce n'est pas pris en charge par la C# indexeur propriétés, qui utilise
int
. Vous pouvez construire à la main en utilisant desArray.CreateInstance(Type, long[])
.Remarque vous devez obtenir les valeurs à l'aide de
Array.GetValue(long)
.Array.CreateInstance(typeof(int), Int32.MaxValue)
jetteOutOfMemoryException
sur 64 bits,Array.CreateInstance(typeof(int), UInt32.MaxValue)
jette "les Tableaux de plus de 2 go ne sont pas pris en charge" même avec lagcAllowVeryLargeObjects
paramètre est activé... (.NET 4.5.3).OriginalL'auteur Patrick Hofman