Est-il une limite de mémoire pour un seul .NET processus
Nous sommes en cours de réflexion de la construction d'un cache-système pour contenir des données extraites d'une base de données SQL et de la rendre accessible à un couple d'autres applications (site web, webservice, etc). Nous imaginons que le cache doit être exécuté en tant que service windows et se composent essentiellement d'une smart dictionnaire qui détient les entrées du cache. Ma question est, est-il une limite à la plage de travail de l'application (il sera exécuté sous windows server 2003)? Ou est la quantité de mémoire physique à la limite?
- Considérez votre expiration du cache de la politique avant d'écrire la première ligne de code. C'est difficile de faire cuire plus tard. Je suppose que vous avez une bonne raison de vouloir faire cela par exemple l'accès hors connexion. La Performance n'est pas une raison suffisante, vous pouvez faire de la perf pire par le biais de la surcharge de mémoire sur la machine locale.
- en fait, la performance est l'une des raisons. la deuxième est que nous voulons pour centraliser le cache pour le faire accessble par diverses sur et hors ligne. avez-vous des expériences dans la construction de systèmes de cache? pouvez-vous recommander la lecture?
- L'ASP.NET système de cache peut être un bon endroit pour obtenir des idées à partir de, ou peut-être la mise en cache de bloc d'application: msdn.microsoft.com/en-us/library/cc309502.aspx
Vous devez vous connecter pour publier un commentaire.
32bit ou 64bit? 32bit est de 2 go (pour un processus), 64 bits est 1 TO (enterprise edition 2003 server).
Cependant, la taille maximale d'un Objet CLR est de 2 go même sur 64 bits.
Mise à jour: l'information ci-dessus est correcte en 2008. Voir Ohad réponse pour des informations plus récentes. Windows 2016 serveur peut avoir un maximum de 24 TO.
J'ai récemment fait une vaste profilage de la mémoire des limites .NET sur un processus 32 bits. Nous sommes tous bombardés par l'idée que l'on peut attribuer jusqu'à 2,4 GO (2^31) dans une .NET application, mais malheureusement ce n'est pas vrai :(. Le processus de demande a beaucoup d'espace à utiliser et le système d'exploitation fait un excellent travail à gérer pour nous, cependant .NET lui-même semble avoir ses propres frais généraux, qui représente environ 600-800 MO pour les applications du monde réel que de pousser la limite de la mémoire. Cela signifie que dès que vous allouer un tableau d'entiers qui prend environ 1,4 GO, vous devriez vous attendre à voir une OutOfMemoryException().
Évidemment, en 64 bits, cette limite se produit plus tard (let's chat en 5 ans :)), mais la taille de tout dans la mémoire pousse aussi (je viens de trouver c'est ~1,7 à ~2 fois) en raison de l'augmentation de la taille de mot.
Ce que je sais, c'est que la Mémoire Virtuelle idée du système d'exploitation certainement ne vous donne PAS pratiquement infinie de l'allocation de l'espace au sein d'un processus. C'est seulement là pour que la totalité de 2,4 GO est adressable à toutes les (nombreuses) demandes d'exécution à la fois.
Le tableau suivant de la MSDN est la plus précise de la réponse à votre requête. Notez que le IMAGE_FILE_LARGE_ADDRESS_AWARE drapeau ne peut être définie directement à partir de la gérée compilateur, mais heureusement, il peut être mis en post-construction via l'utilitaire editbin. 4GT désigne le /3 gb drapeau.
Sur Windows 32 bits, vous pouvez obtenir un peu plus de mémoire par le démarrage de Windows avec le commutateur /3gb dans le drapeau et de l'essoufflement de votre application comme "large address aware"
Matthias,
Pas vraiment une réponse à la question directe, mais une autre façon d'aborder ce problème qui sera autour de quelques-uns des grands pièges, qui peut être un véritable casse-tête avec des solutions de mise en cache. (Désolé je n'ai pas tout lu sur le sujet).
Nous avons mis en place ce dans un projet précédent, et elle a créé d'autres problèmes.
Pour l'accès hors connexion, vous pouvez utiliser sql express sur le bureau pour créer un miroir de votre base de données (ou tout simplement la nécessité d'avoir à cache)? Alors tout ce que vous devez faire est de sélectionner la base de données de votre application est en pointe. Vous pouvez même l'utiliser magasin de diff et relire ces vers le serveur - bien que cela ait d'autres problèmes. Vous pouvez modifier les autorisations sur la copie locale pour faire de cette lecture seule si c'est comment il devrait être.
Les dictionnaires que vous pensez de la création sonore remarquablement comme Sql index. Je voudrais compter sur sql pour faire le travail pour vous si vous pouvez l'architecte de cette façon. Pourquoi réinventer la roue? Si vous le faites, vous aurez à réfléchir attentivement à l'expiration du cache et de la gestion de la mémoire - en particulier si c'est un service windows.
Bonne chance,
Sam
Comme avec tout autre programme Windows, vous êtes limité par l'espace d'adresse. Qui est: sur 32 bits, vous pouvez avoir 2 go d'espace d'adressage. Sur x64, vous pouvez avoir 8 TO.
Si vous n'avez pas 8 to de mémoire physique, il va commencer à la page.