multidimensional - initialize array c#
La limitaciĆ³n del tamaƱo de la matriz.Net (5)
Escuché que hay un límite estricto en el tamaño de .Net Array
. Se dice que la cantidad máxima de memoria que se puede asignar a cualquier instancia individual de un objeto Array
(independientemente de si es int[]
, double[]
o su propia matriz) es de 2 GB. Y no, si tiene una máquina de 64 bits, el límite de 2 GB todavía está allí.
No estoy seguro de si mi impresión es correcta o no. ¿Alguien puede confirmar?
En las versiones de .NET anteriores a 4.5, el tamaño máximo del objeto es de 2 GB. A partir de 4.5, puede asignar objetos más grandes si está habilitado gcAllowVeryLargeObjects . Tenga en cuenta que el límite para la string
no se ve afectado, pero las "matrices" también deberían cubrir las "listas", ya que las listas están respaldadas por matrices.
Eso es correcto. Ningún objeto individual puede tener más de 2 GB .
Al igual que con los sistemas operativos Windows de 32 bits, existe un límite de 2 GB en el tamaño de un objeto que puede crear al ejecutar una aplicación administrada de 64 bits en un sistema operativo Windows de 64 bits.
Esta pregunta tiene detalles adicionales y algunos enlaces útiles: ¿ Objetos individuales todavía están limitados a 2 GB de tamaño en CLR 4.0?
Espero esta ayuda: http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx
es decir
- Utiliza int como índice, que tiene un valor máximo = 2,147,483,647 (2 GB)
- Es por diseño. 2.
Hubiera pensado que el límite podría estar en el índice. Pensé que el índice utilizado tenía que ser un número entero, por lo que cualquier cosa más grande que un entero no funcionaría a menos que tuvieran alguna forma de evitarlo. Entonces eso sería 4294967296 elementos. No estoy seguro de si esto es siquiera verdad a medias. Me gustaría saber la respuesta yo mismo.
EDITAR: como señaló Tomtom, el entero generalmente se firma a menos que use un entero no firmado. Así que la mitad de 4294967296 o 2147483648 aproximadamente.
Primero se encontrará con un límite práctico: es bastante imposible obtener una matriz de 2gb asignada. Los límites prácticos que he encontrado están alrededor de la marca de los 800mb AT START DEL PROGRAMA - descendiendo drásticamente después de eso.
Cualquier cosa más grande que 64mb es una apuesta de suerte en 32 bits: el gran montón de objetos no está desfragmentado, por lo que necesitas 65 MB libres en una pieza o la asignación falla.
Los límites teóricos son:
- memoria utilizable, especialmente menos de 32 bits.
- Espacio de 32 bits para el índice (0 hacia arriba - sin números negativos para las matrices A MENOS QUE JUEGUES INTELIGENTES EN LA CREACIÓN). Puede crear matrices que permitan números negativos, pero no con la sintaxis estándar de C #, solo con reflexión.
- 2 gb por objeto.
Pero en serio, las implicaciones prácticas son más grandes.
Para .NET 4.0 ... considere usar archivos mapeados en memoria;)