2010-10-15 46 views
17

J'essaye de créer un tableau de byte s dont la longueur est UInt32.MaxValue. Ce tableau est essentiellement un petit (ish) en mémoire base de données:Longueur maximale de l'octet []?

byte[] countryCodes = new byte[UInt32.MaxValue]; 

Sur ma machine, cependant, lors de l'exécution, je reçois un System.OverflowException avec « opération arithmétique a donné lieu à un trop-plein ».

Quelle est la situation? Dois-je utiliser un bloc unsafe et malloc? Comment ferais-je cela en C#?

+4

Je n'avais aucune idée qu'il y avait tant de pays! – James

Répondre

24

La mise en œuvre actuelle de System.Array utilise Int32 pour tous ses compteurs internes, etc., de sorte que le nombre maximal théorique d'éléments est Int32.MaxValue.

Il existe également une limite de 2 Go de taille maximale par objet imposée par Microsoft CLR.

Une bonne discussion et solution ici ...

et quelques associés, pas tout à fait en double, questions et réponses ici ...

1

Je ne le ferais pas en premier lieu. Pourquoi voudriez-vous mettre toute cette mémoire de côté pour cette base de données en mémoire? Ne préféreriez-vous pas plutôt une structure de données dont la taille augmente au fur et à mesure (par exemple, List<int>)? Ou (si vous préférez) utiliser une base de données en mémoire comme sqlite?

7

Sur .NET 4.5 La longueur maximale instanciable d'un tableau d'octets est: 2147483591, ou 56 inférieure à int.MaxValue. Trouvé par:

for (int i = int.MaxValue; i > 0; i--) 
{ 
    try 
    { 
     byte[] b = new byte[i]; 
     Console.Out.WriteLine("MaxValue: " + i); 
     Environment.Exit(0); 
    } 
    catch (Exception ignored) 
    {} 
}