Pregunta ¿Hay un límite de memoria para un solo proceso .NET?


Actualmente estamos pensando en construir un sistema de caché para mantener los datos extraídos de una base de datos SQL y ponerlos a disposición de un par de otras aplicaciones (sitio web, servicio web, etc.). Imaginamos que la memoria caché se ejecuta como un servicio de Windows y básicamente consiste en un diccionario inteligente que contiene las entradas de la memoria caché. Mi pregunta es, ¿hay un límite para el conjunto de trabajo de la aplicación (se ejecutará en Windows Server 2003)? ¿O es la cantidad de memoria física el límite?


34
2017-10-14 08:11


origen


Respuestas:


¿32 bits o 64 bits? 32 bits es 2 gb (para un proceso), 64 bits es 1TB (servidor de edición empresarial 2003).

Sin embargo, el tamaño máximo de un objeto CLR es de 2 GB incluso en 64 bits.

Actualizar: la información anterior era correcta en 2008. Ver La respuesta de Ohad para obtener información más reciente. El servidor de Windows 2016 puede tener un máximo de 24TB.


42
2017-10-14 08:15



Recientemente he estado haciendo un amplio perfil sobre los límites de memoria en .NET en un proceso de 32 bits. Todos nos sentimos bombardeados por la idea de que podemos asignar hasta 2,4 GB (2 ^ 31) en una aplicación .NET, pero lamentablemente esto no es cierto :(. El proceso de solicitud tiene mucho espacio para usar y el sistema operativo funciona muy bien. Sin embargo, el propio .NET parece tener su propia sobrecarga, que representa aproximadamente 600-800MB para aplicaciones típicas del mundo real que superan el límite de memoria. Esto significa que tan pronto como se asigna una matriz de enteros que toma aproximadamente 1,4 GB, debe esperar ver OutOfMemoryException ().

Obviamente en 64 bits, este límite se produce mucho más tarde (chateemos en 5 años :)), pero el tamaño general de todo en la memoria también crece (me parece que es ~ 1.7 a ~ 2 veces) debido al aumento del tamaño de la palabra.

Lo que sí sé con certeza es que la idea de Memoria Virtual del sistema operativo definitivamente NO le da un espacio de asignación prácticamente infinito dentro de un proceso. Está solo allí, por lo que los 2.4 GB completos son direccionables para todas las (muchas) aplicaciones que se ejecutan a la vez.


20
2017-12-15 22:41



La siguiente tabla de MSDN es la respuesta más precisa a tu consulta. Tenga en cuenta que el indicador IMAGE_FILE_LARGE_ADDRESS_AWARE no se puede establecer directamente desde el compilador administrado, aunque afortunadamente se puede configurar después de la compilación a través de la utilidad editbin. 4GT se refiere a la bandera / 3gb.

alt text


13
2017-09-17 21:24



En Windows de 32 bits puede obtener un poco más de memoria arrancando Windows con el indicador / 3gb y marcando su aplicación como "gran dirección consciente"


4
2017-10-14 08:27



Matthias,

No es en realidad una respuesta a la pregunta directa, sino otra forma de abordar este problema que sorteará algunos de los grandes escollos, que puede ser un gran dolor de cabeza con soluciones de almacenamiento en caché. (Lo siento, no tengo ninguna lectura recomendada sobre el tema).

Implementamos esto en un proyecto anterior, y creó otros problemas.

Para el acceso sin conexión, ¿puede usar sql express en los escritorios para crear un espejo de su base de datos (o solo el bit que necesita almacenar en caché)? Entonces, todo lo que tiene que hacer es cambiar a qué base de datos apunta su aplicación. Incluso puede usarlo para almacenar diferencias y reproducirlas en el servidor, aunque esto tiene otros problemas. Puede modificar los permisos en la copia local para que esta solo sea de lectura, si así es como debería ser.

Los diccionarios que está pensando en crear sonido son notablemente similares a los índices Sql. Confío en que sql hará el trabajo por usted si puede diseñarlo de esa manera. ¿Por qué reinventar esa rueda? Si lo hace, deberá pensar detenidamente sobre la caducidad de la memoria caché y la gestión de la memoria, especialmente si se trata de un servicio de Windows.

Buena suerte,

Sam


1
2017-10-15 15:01



Al igual que con cualquier otro programa de Windows, está limitado por el espacio de direcciones. Es decir: en 32 bits, puede tener 2 GB de espacio de direcciones. En x64, puede tener 8 TB.

Si no tiene 8 TB de memoria física, comenzará a aparecer la página.


0
2017-10-14 08:15