2010-10-15 14 views
17

Ich versuche ein Array von byte s zu erstellen, deren Länge UInt32.MaxValue ist. Dieses Array ist im Wesentlichen eine kleine (ish) In-Memory-Datenbank:Maximale Länge von Byte []?

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

Auf meinem Rechner jedoch während der Laufzeit, erhalte ich eine System.OverflowException mit „Rechenoperation in einem Überlauf geführt“.

Was ist das Geschäft? Muss ich einen unsafe Block und malloc verwenden? Wie würde ich das in C# machen?

+4

Ich hatte keine Ahnung, dass es so viele Länder gab! – James

Antwort

24

Die aktuelle Implementierung von System.Array verwendet Int32 für alle seine internen Zähler usw., so dass die theoretische maximale Anzahl von Elementen Int32.MaxValue ist.

Es gibt auch eine maximale Größe von 2 GB pro Objekt, die von Microsoft CLR auferlegt wird.

Eine gute Diskussion und Abhilfe hier ...

Und ein paar verwandtes, nicht-ganz-Duplikat, Fragen und Antworten hier ...

1

Ich würde das nicht an erster Stelle tun. Warum möchten Sie all diesen Speicher für diese In-Memory-Datenbank zur Verfügung stellen? Möchten Sie nicht lieber eine Datenstruktur haben, deren Größe sich mit der Zeit erhöht (z. B. List<int>)? Oder (wenn gewünscht) eine In-Memory-Datenbank wie sqlite verwenden?

7

On .NET 4.5 Die maximale Instanziierbare Länge eines Byte-Arrays ist: 2147483591, oder 56 weniger als int.MaxValue. Gefunden 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) 
    {} 
}