2008-10-14 10 views
32

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?Existe un límite de memoria para un solo proceso .NET

+1

Tenga en cuenta su política de caducidad de la caché antes de escribir la primera línea de código. Esto es difícil de cocer más tarde. Supongo que tiene buenas razones para querer hacer esto, p. acceso fuera de línea. El rendimiento no es una buena razón, puede empeorar la situación a través de la sobrecarga de memoria en la máquina local. –

+0

en realidad, el rendimiento es una razón. el segundo es que queremos centralizar el caché para que sea accesible por varias aplicaciones en línea y fuera de línea. ¿tienes experiencias en la construcción de sistemas de caché? ¿Puedes recomendar más lecturas? – Mats

+0

El sistema de caché ASP.NET puede ser un buen lugar para obtener algunas ideas, o tal vez el bloque de aplicación de almacenamiento en caché: http://msdn.microsoft.com/en-us/library/cc309502.aspx –

Respuesta

39

¿32 bits o 64 bits? 32 bits es 2 gb (para un proceso), 64 bits es 1TB (enterprise edition 2003 server).

However, the maximum size of a CLR Object is 2gb incluso en 64 bits.

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

+0

gracias por la lectura. Parece que esta publicación se ha escrito antes del lanzamiento de .net 2.0. Me pregunto si ha habido algún cambio en versiones posteriores. – Mats

+2

Es relevante para la versión 2.0 del tiempo de ejecución, pero no piense que ha cambiado en 3.5. Tener un solo objeto de 2gb (a menos que sea una matriz de bytes) es bastante inusual de todos modos, en su caso sería una lista de objetos de tamaño N para que esté bien. –

+1

las restricciones son las mismas en .NET 4 también. –

0

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á la página.

+1

Y si no lo hace Tengo 8 TB de espacio disponible en el disco duro (deseo) y luego comenzará a recibir la excepción de OutOfMemoryException. Demasiado. Sin embargo, pasará un tiempo antes de que muchos de nosotros tengamos discos duros de ese tamaño en nuestras máquinas de desarrollo. :( –

4

En Windows de 32 bits se puede obtener un poco más de memoria mediante el arranque de Windows con el indicador/3GB y marcar su aplicación como "gran dirección consciente"

+0

¿Tiene un enlace para seguir leyendo en este caso? – Mats

+2

No es que tenga más memoria en XP (es decir, más de esos 4 GB de RAM) sino que puede ejecutar un proceso de hasta 3 GB de RAM http://msdn.microsoft.com/en-us/library/ms791558. aspx –

+1

Tampoco lo use con Virtual PC o Virtual Server http://blogs.msdn.com/virtual_pc_guy/archive/2004/12/23/331100.aspx –

1

Matthias,

No

en realidad una respuesta a la pregunta directa , pero otra forma de abordar este problema que sorteará 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 asunto.)

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 en los que está pensando 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

20

que recientemente han estado haciendo extensa perfilado alrededor de 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 (creo que es ~ 1.7 a ~ 2 veces) debido a la palabra incrementada tamaño.

Lo que sí estoy seguro es que la idea de memoria virtual del sistema operativo definitivamente NO le proporciona 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.

+0

¿Alguien puede confirmar este punto? Es muy relevante ... –

+0

No puedo confirmarlo, pero de acuerdo con mis pruebas si realmente parece ser cierto. –

12

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 establecer después de compilar via the editbin utility. 4GT se refiere a la bandera/3gb.

alt text

Cuestiones relacionadas