2011-04-26 16 views
7

Para mi ejercicio de programación en C#, estoy tratando de crear una matriz de long, con una longitud de 0x1fffffff (536,870,911 en base10), sin embargo obtuve System.OutOfMEmoryException.Gran matriz C# OutOfMemoryException

Para la compilación, apunté al sistema x64, y estoy ejecutando VisualStudio2008 en Windows7 x64 con 8 GB de RAM. Debería haber suficiente memoria para la matriz (funciona en el proyecto JDK x64 y CPP)

¿Alguna idea?

 const long MAX = 0x1fffffff; // 536870911 in base10 
     program.arr = new long[MAX]; 
     for (long i = 0; i < MAX; i++) 
     { 
      program.arr[i] = i;     
     } 
+0

FYI, se llama "C#", no "CSharp". –

+5

No se puede hacer un objeto tan grande. Pero incluso si pudieras, parece que también estás sufriendo por la idea equivocada de que la memoria RAM determina la cantidad de memoria que puedes asignar. No lo hace, y no lo ha hecho durante décadas. La cantidad de RAM limita la forma * rápida * en la que podrá acceder a esa memoria. Tener una gran RAM es una optimización del rendimiento; las asignaciones de memoria realmente se consideran mejor como asignaciones del archivo de página. Recuerde, cuando asigna memoria está asignando * memoria virtual *, no * memoria de hardware *. –

Respuesta

25

El CLR no admite ningún objeto de tamaño superior a unos 2 GB. Está solicitando una matriz de 4,294,967,288 bytes, más del doble de lo que admite.

Puede usar esa cantidad de memoria, pero no en un solo objeto (como una matriz).

5

Es difícil recomendar cualquier tipo de alternativa significativa ya que no indica lo que está tratando de lograr, simplemente lo que no puede hacer.

Dicho esto, si realmente necesita algo que sea una vista contigua rápida en un espacio de direcciones planas de más de 2 GB de tamaño, puede usar MemoryMappedFile.

Sería de gran ayuda si indicó lo se quiere decir que vamos en este trozo de la memoria, ¿por qué el espacio de direcciones en sí debe ser contiguos (estás pasando un puntero a ella a código no administrado por ejemplo) y por lo que necesita direccionamiento plano.

0

Hacer un subconjunto de la matriz a continuación, rellenar la matriz

yourary []

masterarray [] < ------ Llenar youraray [] hasta 2 GB de memoria intermedia después añadirlo en el masterarray

Cuestiones relacionadas