La limitación en el tamaño de la matriz .Net

Escuché que hay un límite duro 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 sigue ahí.

No estoy seguro de si mi impresión es correcta o no. ¿Alguien puede confirmar?

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, hay un límite de 2 GB en el tamaño de un objeto que puede crear mientras ejecuta una aplicación administrada de 64 bits en un sistema operativo Windows de 64 bits.

Esta pregunta tiene detalles adicionales y algunos enlaces útiles: ¿ Los objetos individuales todavía están limitados a 2 GB de tamaño en CLR 4.0?

En versiones de .NET anteriores a 4.5, el tamaño máximo del objeto es de 2 GB. Desde 4.5 en adelante, puede asignar objetos más grandes si gcAllowVeryLargeObjects está habilitado. Tenga en cuenta que el límite para la string no se ve afectado, pero las “matrices” también deben cubrir “listas”, ya que las listas están respaldadas por matrices.

Primero se encontrará con un límite práctico: es bastante imposible obtener una matriz de 2 gb asignada. Los límites prácticos que he encontrado están alrededor de la marca de 800 mb EN EL INICIO DEL PROGRAMA, que se reduce drásticamente después de eso.

Todo lo que supere los 64 mb es un juego de suerte en 32 bits: el montón de objetos grandes no está desfragmentado, por lo que necesita 65 mb libres en una pieza o la asignación falla.

Los límites teóricos son:

  • Memoria utilizable, especialmente bajo 32 bit.
  • 32 bits espacio de número para el índice (0 hacia arriba – no hay números negativos para las matrices A MENOS QUE JUEGUE INTELIGENTE EN CREACIÓN). Puede crear matrices que permitan números negativos, pero no con la syntax estándar de C #, solo con reflexión.
  • 2gb por objeto.

Pero en serio, las implicaciones prácticas son mayores.

Para .NET 4.0 … considere usar archivos mapeados en memoria;)

Pensé que el límite podría estar en el índice. Pensé que el índice usado tiene que ser un entero para que cualquier cosa más grande que un entero no funcione a menos que tengan alguna forma de evitarlo. Entonces eso sería 4294967296 elementos. No estoy seguro de si esto es verdad a medias. Me gustaría saber la respuesta a mí mismo.

EDITAR: como lo señaló Tomtom, el entero generalmente se firma a menos que use un entero sin signo. Así que la mitad de 4294967296 o 2147483648 aproximadamente.

Espero esta ayuda: http://blogs.msdn.com/joshwil/archive/2005/08/10/450202.aspx

es decir

  1. Utiliza int como índice, que tiene un valor máximo = 2,147,483,647 (2GB)
  2. Es por diseño. 2.