Question

Nous envisageons actuellement de créer un système de cache pour stocker les données extraites d’une base de données SQL et les mettre à la disposition de deux autres applications (site Web, service Web, etc.). Nous imaginons que le cache s'exécute en tant que service Windows et consiste essentiellement en un dictionnaire intelligent qui contient les entrées du cache. Ma question est la suivante: existe-t-il une limite au groupe de travail de l'application (celle-ci sera exécutée sous Windows Server 2003)? Ou la quantité de mémoire physique est-elle la limite?

Était-ce utile?

La solution

32bit ou 64bit? 32 bits, c'est 2 Go (pour un processus), 64 bits, 1 To (serveur Enterprise Edition 2003) .

Toutefois, la taille maximale d'un objet CLR est de 2 Go même sur 64 bits.

Mise à jour: les informations ci-dessus étaient correctes en 2008. Consultez la réponse d'Ohad pour une information plus récente. information. Le serveur Windows 2016 peut avoir un maximum de 24TB .

Autres conseils

J'ai récemment effectué un profilage exhaustif des limites de mémoire dans .NET sur un processus 32 bits. Nous sommes tous bombardés par l’idée que nous pouvons allouer jusqu’à 2,4 Go (2 ^ 31) dans une application .NET, mais malheureusement, ce n’est pas vrai :(. Le processus de demande a autant d’espace à utiliser et le système d’exploitation fait une excellente Cependant, .NET lui-même semble avoir sa propre surcharge, ce qui représente environ 600 à 800 Mo d’applications typiques du monde réel qui repoussent les limites de la mémoire. Cela signifie que dès que vous allouez un tableau d’entiers prenant environ 1,4 Go, vous devriez vous attendre à voir une OutOfMemoryException ().

Évidemment, en 64 bits, cette limite est bien plus tardive (discutons dans 5 ans :)), mais la taille générale de tout ce qui se trouve dans la mémoire augmente également (je trouve que c'est ~ 1,7 à 2 fois) en raison de la taille accrue du mot. .

Ce que je sais avec certitude, c’est que l’idée de la mémoire virtuelle du système d’exploitation ne vous donne PAS un espace d’allocation pratiquement infini au sein d’un même processus. C’est uniquement là que la totalité des 2,4 Go est adressable à toutes les applications (nombreuses) exécutées en même temps.

Le tableau suivant tiré de MSDN est la réponse la plus précise à votre question. Notez que l'indicateur IMAGE_FILE_LARGE_ADDRESS_AWARE ne peut pas être défini directement à partir du compilateur géré, bien qu'il puisse heureusement être défini après la compilation via l'utilitaire editbin . 4GT fait référence au drapeau / 3gb.

alt text

Sous Windows 32 bits, vous pouvez obtenir un peu plus de mémoire en démarrant Windows avec l'indicateur / 3gb et en signalant votre application comme étant "avec une adresse étendue"

.

Matthias,

Ce n’est pas vraiment une réponse à la question directe, mais une autre façon d’aborder ce problème qui permettra de contourner certains des gros écueils, ce qui peut être un casse-tête majeur pour les solutions de mise en cache. (Désolé, aucune lecture n’est recommandée à ce sujet.)

Nous l'avons implémenté dans un projet précédent et cela a créé d'autres problèmes.

Pour un accès hors connexion, pouvez-vous utiliser SQL Express sur les ordinateurs de bureau pour créer un miroir de votre base de données (ou simplement le bit dont vous avez besoin pour mettre en cache)? Il vous suffit ensuite de changer de base de données vers votre application. Vous pouvez même l’utiliser pour stocker des diffs et les rejouer sur le serveur - bien que cela pose d’autres problèmes. Vous pouvez modifier les autorisations sur la copie locale pour rendre celle-ci en lecture seule si c'est ce qu'elle devrait être.

Les dictionnaires que vous envisagez de créer sonnent remarquablement comme des index Sql. Je me fierais à SQL pour faire le travail à votre place si vous pouviez le concevoir de cette façon. Pourquoi réinventer cette roue? Si vous le faites, vous devrez bien réfléchir à l'expiration du cache et à la gestion de la mémoire, en particulier s'il s'agit d'un service Windows.

Bonne chance,

Sam

Comme avec tout autre programme Windows, vous êtes limité par un espace d'adressage. C'est-à-dire que sur 32 bits, vous pouvez avoir 2 Go d'espace d'adressage. Sur x64, vous pouvez avoir 8 To.

Si vous ne disposez pas de 8 To de mémoire physique, la page commencera.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top