web-dev-qa-db-fra.com

Longueur maximale de l'octet []?

J'essaie de créer un tableau de bytes dont la longueur est UInt32.MaxValue. Ce tableau est essentiellement une base de données dans la mémoire (ISH):

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

Sur ma machine, cependant, au moment de l'exécution, je reçois un System.OverflowException avec "opération arithmétique a abouti à un débordement".

Quel est le problème? Dois-je utiliser un bloc unsafe block et malloc? Comment ferais-je cela en C #?

20
GoHeavyOrGoHome

La mise en œuvre actuelle de System.Array les usages Int32 Pour tous ses compteurs internes, etc., le nombre maximal théorique d'éléments est donc Int32.MaxValue.

Il existe également une limite de 2 Go Max-taille-Per-Object imposée par Microsoft CLR.

Une bonne discussion et la solution de contournement ici ...

Et quelques-uns liés, non-dupliqués, questions et réponses ici ...

28
LukeH

Sur .NET 4.5 La longueur maximale instanciable d'un tableau d'octets est la suivante: 2147483591, ou 56 de moins que INT.MAXValue. Trouvé via:

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)
    {}
}
8
Nick

La longueur maximale d'un tableau d'octets est: 2130702268. Par exemple:

var countryCodes = new byte[2130702268];
2
Milad Hatami

Je ne ferais pas cela en premier lieu. Pourquoi voudriez-vous définir toute cette mémoire de côté pour cette base de données en mémoire? Ne préféreriez-vous pas vouloir soit une structure de données qui augmente les augmentations de taille que vous allez (par exemple List<int>)? Ou (si préféré) utilise une base de données en mémoire comme sqlite ?

1
steinar