Pregunta

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?

¿Fue útil?

Solución

¿32 bits o 64 bits? 32 bits es 2 gb (para un proceso), 64 bits es 1TB (servidor Enterprise Edition 2003) .

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

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

Otros consejos

Recientemente, he estado realizando un amplio análisis de los límites de memoria en .NET en un proceso de 32 bits. Todos nos vemos bombardeados por la idea de que podemos asignar hasta 2.4GB (2 ^ 31) en una aplicación .NET, pero desafortunadamente esto no es cierto :(. El proceso de la aplicación tiene mucho espacio para usar y el sistema operativo hace un gran trabajo. sin embargo, el propio .NET parece tener su propia sobrecarga que representa aproximadamente 600-800MB para las aplicaciones típicas del mundo real que aumentan el límite de la memoria. Esto significa que tan pronto como asigna una matriz de enteros que requiere aproximadamente 1.4 GB, debe esperar ver una excepción OutOfMemoryException ().

Obviamente, en 64 bits, este límite ocurre mucho más tarde (hablemos en 5 años :)), pero el tamaño general de todo lo que hay en la memoria también aumenta (me parece que es ~ 1.7 a ~ 2 veces) debido al aumento en el tamaño de las palabras .

Lo que sé con certeza es que la idea de la memoria virtual del sistema operativo definitivamente NO le otorga espacio de asignación virtualmente infinito en un proceso. Solo está allí para que los 2.4 GB completos sean direccionables a todas las (muchas) aplicaciones que se ejecutan a la vez.

La siguiente tabla de MSDN es la respuesta más precisa a su 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

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

Matthias,

En realidad no es una respuesta a la pregunta directa, sino otra forma de abordar este problema que solucionará algunos de los grandes escollos, que puede ser un gran dolor de cabeza con las 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 para el caché)? Luego, todo lo que necesita hacer es cambiar la base de datos a la que apunta su aplicación. Incluso puede usarlo para almacenar y reproducir estos en el servidor, aunque esto tiene otros problemas. Puede alterar los permisos en la copia local para que sea de solo lectura si así es como debería ser.

Los diccionarios en los que piensa crear un sonido notablemente similar a los índices Sql. Confiaría en sql para que haga 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 administración de memoria, especialmente si se trata de un servicio de Windows.

Buena suerte,

Sam

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, puedes tener 8TB. ??

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top