2010-10-15 18 views
17

Estoy tratando de crear una matriz de byte s cuya longitud es UInt32.MaxValue. Esta matriz es esencialmente una pequeña (más o menos) en memoria de base de datos:Longitud máxima de byte []?

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

En mi máquina, sin embargo, en tiempo de ejecución, aparece un System.OverflowException con "operación aritmética dio lugar a un desbordamiento".

¿Cuál es el problema? ¿Debo utilizar un bloque unsafe y malloc? ¿Cómo haría eso en C#?

+4

¡No tenía idea de que había tantos países! – James

Respuesta

24

La implementación actual de System.Array usa Int32 para todos sus contadores internos, etc., por lo que el número máximo teórico de elementos es Int32.MaxValue.

También hay un límite de 2 GB de tamaño máximo por objeto impuesto por Microsoft CLR.

Una buena discusión y solución aquí ...

Y unos pocos relacionado, no del todo duplicado, preguntas y respuestas aquí ...

1

Yo no haría esto en primer lugar. ¿Por qué querrías dejar a un lado toda esa memoria para esta base de datos en memoria? ¿No preferiría una estructura de datos cuyo tamaño aumenta a medida que avanza (por ejemplo, List<int>)? O (si lo prefiere) use una base de datos en memoria como sqlite?

7

En .NET 4.5 La longitud máxima instanciable de una matriz de bytes es: 2147483591, o 56 menos que int.MaxValue. Se encontró a través de:

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