35 votes

Il n'y a pas assez de mémoire disponible pour traiter cette commande dans VisualStudio 2008.

Lorsque j'essaie de compiler un assemblage dans VS 2008, j'obtiens (occasionnellement, généralement après 2-3 heures de travail avec le projet) l'erreur suivante

Le fichier de métadonnées '[nom].dll' n'a pas pu être ouvert -- 'L'espace disponible est insuffisant pour traiter cette commande.

En général, pour s'en débarrasser, je dois redémarrer Visual Studio.

L'assemblage que je dois utiliser dans mon projet est assez GROS (> 70 Mb) et c'est probablement la raison de ce bug, je n'ai jamais vu quelque chose comme ça dans mes projets précédents. Ok, si c'est la raison, ma question est de savoir pourquoi cela se produit et ce que je dois faire pour l'arrêter.

J'ai assez de mémoire libre sur mes disques et 2 Go de RAM (seulement ~1,2 Go sont utilisés quand l'exception se produit).

J'ai cherché sur Google les réponses aux questions de ce genre.

Les suggestions portent généralement sur : 1) au nombre de gestionnaires d'utilisateurs qui est limité dans WinXP... 2) à la limite physique de la mémoire disponible par processus.

Je ne pense pas que l'un ou l'autre puisse expliquer mon cas.

Pour les gestionnaires d'utilisateurs et les autres ressources de l'interface graphique, je ne pense pas que cela puisse être un problème. Le gros assemblage de 70Mo est en fait un code sans interface graphique qui fonctionne avec des sockets et implémente des parsers de protocoles propriétaires. Dans mon projet actuel, je n'ai que 3 formulaires GUI, avec un nombre total de contrôles GUI < 100.

Je suppose que mon cas est plus proche du fait que, dans Windows XP, l'espace d'adressage du processus est limité à 2 Go de mémoire (et, compte tenu de la segmentation de la mémoire, il est possible que je ne dispose pas d'un segment libre suffisamment grand pour allouer une mémoire). Cependant, il est difficile de croire que la segmentation puisse être si importante après seulement 2-3 heures de travail avec le projet dans Visual Studio. Le gestionnaire de tâches montre que VS consomme environ 400-500 Mb (OM + VM). Pendant la compilation, VS n'a besoin de charger que les méta-données. Eh bien, il y a beaucoup de classes et d'interfaces dans cette bibliothèque, mais je m'attendrais quand même à ce que 1 à 2 Mo soient plus que suffisants pour allouer métadonnées qui est utilisé par le compilateur pour trouver toutes les classes et interfaces publiques (bien que ce ne soit que ma suggestion, je ne sais pas ce qui se passe exactement dans le CLR quand il charge les métadonnées d'assemblage).

De plus, je dirais que la taille de l'ensemble est si importante uniquement parce qu'il s'agit d'une bibliothèque CLI C++ qui contient d'autres bibliothèques non gérées liées statiquement dans une DLL. J'ai estimé (en utilisant Reflector) que le code .NET (géré) représente environ 5 à 10 % de cet assemblage.

Avez-vous des idées pour définir la véritable raison de ce bug ? Existe-t-il des restrictions ou des recommandations quant à la taille des assemblages .NET ? ( Oui, je sais que cela vaut la peine de penser à refactorer et à diviser un grand assemblage en plusieurs petits morceaux, mais il s'agit d'un composant tiers et je ne peux pas le reconstruire. )

2voto

Une autre cause de ce problème peut être l'utilisation de trop d'ensembles de données typées via le concepteur. ou d'autres types qui peuvent être instanciés via un concepteur comme beaucoup de contrôles liés aux données sur beaucoup de formulaires. J'imagine que vous êtes le genre de programmeur acharné qui ne ferait pas de glisser-déposer sur un DS ! :D

En ce qui concerne votre problème, Bogdan, avez-vous essayé de reproduire le problème sans votre composant c++ chargé ? Si vous n'y arrivez pas, c'est peut-être ça. Comment chargez-vous le composant ? Avez-vous essayé d'autres techniques comme la liaison tardive, etc ? une différence ?

Supplémentaire : Oui, vous avez raison, les autres coupables sont les nombreux contrôles sur le formulaire. J'ai déjà rencontré ce même problème avec un développeur qui avait importé une application très VB6 vers .net. Il avait littéralement des centaines de formulaires. Il obtenait des plantages périodiques de l'IDE après quelques heures. Je suis presque sûr que c'était l'épuisement des fils. Cela pourrait valoir la peine de configurer une boîte vanille sans addins chargés juste pour exclure les addins, mais je pense que vous vous heurtez à un mur en termes de limites combinées de VS et des spécifications de votre boîte. Essayez d'exécuter Windows Vista 64bit et installez quelques modules de RAM supplémentaires.

1voto

Jas Points 11

Si l'utilisation de la mémoire et la taille de la VM sont faibles pour devenv. Tuez explicitement "TOUTES" les instances de devenv.exe en cours d'exécution.

J'avais 3 devenv.exe qui tournaient alors que j'avais deux instances de Visual studion ouvertes en face.

C'était la solution dans mon cas.

1voto

Jon Points 31

Je sais que cela fait longtemps que ce sujet n'a pas été abordé, mais j'ai rencontré exactement le même problème aujourd'hui avec une dll de Telerik dans VS2010. Je n'avais jamais vu ce problème avant aujourd'hui, alors que je modifiais certains paramètres dans IE.

Il existe un paramètre dans Tools/Folder Option/View dans la section Files and Folders appelé "Launch folder Windows in a separate process".

Je ne suis pas sûr de la quantité de mémoire utilisée pour chaque fenêtre lors de l'utilisation de ce paramètre, mais jusqu'à aujourd'hui, je n'avais jamais coché cette option. Après avoir coché cette option pour diverses raisons, j'ai commencé à recevoir le message "not enough storage is available to process this command". La dll Telerik est une dll de 18 mb que nous utilisons et qui se trouve dans notre dossier bibliothèque comme référence dans notre projet.

Le fait de décocher cette option a résolu le problème.

Je ne fais que transmettre une autre solution possible

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X