J'essaie de créer un tableau de byte
s 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 #?
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 ...
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)
{}
}
La longueur maximale d'un tableau d'octets est: 2130702268. Par exemple:
var countryCodes = new byte[2130702268];
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 ?