Y at-il une limite de mémoire pour un seul processus.NET




memory .net-3.5 (4)

32bit ou 64bit? 32 bits est 2 Go (pour un processus), 64 bits est 1 To (serveur édition entreprise 2003) .

Cependant, 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. Voir la réponse d' Ohad pour des informations plus récentes. Le serveur Windows 2016 peut avoir un maximum de 24TB .

Nous envisageons actuellement de construire un système de cache pour stocker les données extraites d'une base de données SQL et les mettre à la disposition de quelques autres applications (site web, service web, etc.). Nous imaginons que le cache fonctionne comme un service Windows et consiste essentiellement en un dictionnaire intelligent qui contient les entrées du cache. Ma question est, y at-il une limite à l'ensemble de travail de l'application (il sera exécuté sous Windows Server 2003)? Ou est la quantité de mémoire physique la limite?


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

Si vous n'avez pas 8 To de mémoire physique, il commencera à paginer.


Le tableau suivant de msdn.microsoft.com/en-us/library/… est la réponse la plus précise à votre requête. Notez que l'indicateur IMAGE_FILE_LARGE_ADDRESS_AWARE ne peut pas être défini directement à partir du compilateur géré, mais heureusement, il peut être défini après la génération via l'utilitaire editbin . 4GT fait référence au drapeau / 3gb.


Matthias,

Pas vraiment une réponse à la question directe, mais une autre façon d'aborder ce problème qui permettra de contourner certains des grands pièges, ce qui peut être un casse-tête majeur avec des solutions de mise en cache. (Désolé je n'ai aucune lecture recommandée sur le 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 ligne, pouvez-vous utiliser sql express sur les bureaux pour créer un miroir de votre base de données (ou juste le bit dont vous avez besoin de mettre en cache)? Ensuite, tout ce que vous avez à faire est de changer la base de données vers laquelle pointe votre application. Vous pouvez même l'utiliser pour stocker des différences et les rejouer sur le serveur - même si cela a d'autres problèmes. Vous pouvez modifier les permissions sur la copie locale pour rendre celle-ci en lecture seule si c'est comme cela qu'elle devrait l'être.

Les dictionnaires que vous envisagez de créer sonne remarquablement comme les index Sql. Je compterais sur SQL pour faire le travail pour vous si vous pouvez l'architecturer de cette façon. Pourquoi réinventer cette roue? Si vous le faites, vous devrez réfléchir soigneusement à l'expiration du cache et à la gestion de la mémoire, en particulier s'il s'agit d'un service Windows.

Bonne chance,

Sam





limit