2010-10-15 21 views
17

Sto provando a creare un array di byte s la cui lunghezza è UInt32.MaxValue. Questo array è essenzialmente un piccolo (ish) in memoria del database:Lunghezza massima del byte []?

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

Sulla mia macchina, però, in fase di esecuzione, ho un System.OverflowException con "operazione aritmetica ha comportato un overflow".

Qual è l'affare? Devo utilizzare un blocco unsafe e malloc? Come lo farei in C#?

+4

Non avevo idea c'erano così tanti paesi! – James

risposta

24

L'attuale implementazione di System.Array utilizza Int32 per tutti i suoi contatori interni ecc., Quindi il numero massimo teorico di elementi è Int32.MaxValue.

C'è anche un limite massimo di 2 GB per oggetto imposto dal CLR di Microsoft.

Una buona discussione e soluzione qui ...

E pochi correlato, non-proprio-duplicato, domande e risposte qui ...

1

non vorrei fare questo in primo luogo. Perché dovresti mettere da parte tutta la memoria per questo database in memoria? Preferiresti piuttosto una struttura dati con le dimensioni che aumentano man mano che procedi (ad esempio List<int>)? Oppure (se si preferisce) utilizzare un database in memoria come sqlite?

7

Su .NET 4.5 La lunghezza massima istantanea di un array di byte è: 2147483591 o 56 in meno di int.MaxValue. Trovato 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) 
    {} 
} 
Problemi correlati