c# - ¿Limitaciones de memoria en una aplicación.Net de 64 bits?
windows memory-management (2)
Actualización: el límite de memoria de un solo objeto de 2Gb se ha eliminado en 64 bits con el lanzamiento de .NET 4.5.
Deberá establecer gcAllowVeryLargeObjects
en su app.config.
Sin embargo, la cantidad máxima de elementos en una matriz sigue siendo 2 ^ 32-1.
Ver Objetos individuales aún limitado a 2 GB de tamaño en CLR 4.0? para más detalles.
En mi computadora portátil, ejecutando Windows 7 de 64 bits y con 2 GB de memoria libre (según lo informado por el Administrador de tareas), puedo hacer lo siguiente:
var x = new Dictionary<Guid, decimal>( 30 * 1024 *1024 );
Sin tener una computadora con más memoria RAM en las manos, me pregunto si esto se escalará para que en una computadora con 4 GB de memoria libre, pueda asignar 60 millones de elementos en lugar de "solo" 30 millones, etc.
¿O hay otras limitaciones (de .Net y / o Windows) con las que me encontraré antes de poder consumir toda la memoria RAM disponible?
Actualización: OK, así que no puedo asignar un solo objeto de más de 2 Gb. ¡Eso es importante saber! Pero luego, por supuesto, tengo curiosidad por saber si podré utilizar completamente toda la memoria asignando fragmentos de 2 Gb como este:
var x = new List<Dictionary<Guid, decimal>>();
for ( var i = 0 ; i < 10 ; i++ )
x.Add( new Dictionary<Guid, decimal>( 30 * 1024 *1024 ) );
¿Funcionaría esto si la computadora tiene> 20Gb de memoria libre?
Hay una limitación de 2 GiB en todos los objetos en .NET, nunca se le permite crear un solo objeto que exceda 2 GiB. Si necesita un objeto más grande, debe asegurarse de que los objetos estén construidos con piezas de menos de 2 GiB, por lo que no puede tener una matriz de bits continuos de más de 2 GiB o una sola cadena de más de 512 MiB, no estoy totalmente seguro de la cadena, pero he hecho algunas pruebas sobre el tema y estaba obteniendo OutOfMemoryExceptions cuando traté de asignar cadenas de más de 512 MiB.
Sin embargo, estos límites están sujetos a la fragmentación del montón e incluso si el GC intenta compactar el montón, los objetos grandes (que es algo así como un cruce arbitrario de alrededor de 80 K) terminan en el gran montón de objetos que es un montón que no está compactado . Estrictamente hablando, y algo así como una nota al margen, si puede mantener asignaciones de corta duración por debajo de este umbral, sería mejor para su gestión general de la memoria GC y el rendimiento.