Je suis en train de tester la taille d'une collection dans .Net. Techniquement, n'importe quel objet de collection peut atteindre la taille de la mémoire physique. Puis j'ai testé le code suivant dans un serveur, qui a 16 Go de mémoire, exécutant Windows 2003 Server et Visual Studio 2008. J'ai testé le code F # et C#, et j'ai regardé le gestionnaire des tâches pendant l'exécution. Je peux voir que, après la croissance de la mémoire de 2 Go, le programme s'est écrasé avec une exception de mémoire insuffisante. J'ai défini la plate-forme cible sur x64 dans la page de propriétés. J'ai fait un même test à la bibliothèque de la collection C5Une très grande collection dans .Net provoque une exception de mémoire insuffisante
open System.Collections.Generic
let d = new Dictionary<int, int>()
for i=1 to 1000000000 do
d.Add(i,i)
Le résultat est que le dictionnaire en C5 pourrait utiliser toute la mémoire. Le code utilise C5:
let d = C5.HashDictionary<int, int>()
for i=1 to 1000000000 do
d.Add(i,i)
Quelqu'un sait pourquoi?
mémoire physique n'a rien à voir avec des tailles maximales. Windows utilise la gestion de la mémoire virtuelle depuis plus d'une décennie maintenant. Vous pouvez avoir des objets qui sont loin, beaucoup plus grande que la mémoire physique disponible car bien sûr, la mémoire physique disponible peut être * zéro * lorsqu'un nouveau processus est créé. C'est tout le * point * de la mémoire virtuelle; cette mémoire physique est juste une optimisation des performances de la mémoire virtuelle. (S'il n'y a pas assez de mémoire physique pour contenir le jeu de travail, la performance se dégrade, mais tout devrait fonctionner *.) –
@EricLippert Compris et accepté, mais qu'en est-il de l'inverse ... Devriez-vous obtenir un MOO quand il y a de la mémoire physique? disponible? (En supposant que c'est un vrai MOO pas un trop grand nombre de poignées/problème similaire). Dans ce cas, il semble que la limite imposée par le CLR était le problème, mais cela ne signifie que la question OP est un bon à mon avis – Basic