2010-06-25 3 views
1

Après avoir lu Are C# Strings (and other .NET API’s) limited to 2GB in size? j'ai joué avec de grandes chaînes et des tableaux dans .NET 3.5. J'ai trouvé que le plus grand tableau que je pouvais allouer était int.MaxValue - 56 octets. Une chose similaire pour les chaînes: le plus grand que j'ai pu obtenir était (int.MaxValue - 58)/2 caractères (puisque chaque personnage a pris 2 octets). Après cela, il lance OutOfMemoryException.Pourquoi ne puis-je pas créer un objet de taille supérieure à 2 Go dans .NET, même sur x64?

Pourquoi cette limitation existe-t-elle? Pas que je l'ai jamais rencontré en pratique - je suis juste curieux de connaître le fonctionnement interne de .NET. Oui, c'était sur une machine 64-bit avec beaucoup de RAM, bien sûr - et oui, le processus était en cours d'exécution en 64-bit. (Je pourrais réellement allouer 3 tels tableaux ou chaînes pour une utilisation totale de la mémoire de 6 Go.)

Répondre

1

Il était une décision de conception de restreindre la taille d'un objet sur le tas GC à 2 Go, même sur x64. après un bon blog sur le sujet ici d'une des personnes impliquées dans la décision de conception:

http://blogs.msdn.com/b/joshwil/archive/2005/08/10/450202.aspx

+0

Merci. Cela confirme qu'il s'agissait d'une décision de conception consciente, même si cela n'explique pas vraiment pourquoi ils ont pris cette décision. – EMP

0

Dans les versions de .NET avant 4.5, la taille maximale de l'objet est de 2 Go. A partir de la version 4.5, vous pouvez allouer des objets plus grands si gcAllowVeryLargeObjects est activé. Notez que la limite pour string n'est pas affectée, mais les «tableaux» doivent également couvrir les «listes», car les listes sont sauvegardées par des tableaux.

Questions connexes