Environnement:
Nous avons une application de bureau qui joue une vidéo. Cette vidéo fait partie d'un projet et le projet est intégré dans le programme d'installation. De temps en temps, la construction du projet d’installation affiche ce message d’erreur:
Pas assez de stockage est disponible pour terminer cette opération
Si je redémarre Visual Studio, cela fonctionne.
Y a-t-il un moyen d'éviter cela? Existe-t-il un meilleur moyen de regrouper des vidéos dans un programme d'installation?
Cela se produit généralement lorsque le processus de construction nécessite beaucoup de mémoire RAM et ne peut pas l’obtenir. Depuis que le redémarrage de Visual Studio a résolu le problème, il est fort probable que votre cas aussi.
Essayez de fermer certaines des applications en cours d'exécution. Vous pouvez également essayer d’ajouter plus de RAM à votre ordinateur ou d’augmenter le fichier de page.
Problème
Dans mon cas, le problème concernait un projet de test contenant un très gros fichier de test (1,5 Go) sous forme de ressource embedded. J'ai 16 Go RAM dans ma machine avec 8 Go gratuits lorsque cela s'est produit, donc RAM n'était pas le problème.
Il est possible que nous atteignions la limite de 2 Go du CLR sur un seul objet. Sans entrer dans les détails de ce que MSBuild est en train de faire, je ne peux que supposer que, pendant la compilation, la ressource incorporée est chargée dans un graphe d'objet qui atteint cette limite.
Le message d'erreur est très inutile. Quand j'ai vu cela, ma première pensée a été: "Est-ce que je n'ai plus d'espace disque?"
Solution
C'est un projet de test de validation de fichier. L'une des conditions est de pouvoir gérer des fichiers de cette taille. Mon équipe a donc jugé qu'il était raisonnable de l'intégrer pour l'utiliser dans des scénarios de test.
Nous avons corrigé l'erreur en déplaçant le fichier sur le réseau (de la même manière que le validateur y accédait en production) et en marquant le test comme test d'intégration au lieu d'un test unitaire. Après tout, les tests unitaires ne sont-ils pas censés être rapides?
Je suis tombé sur cette question lorsque j'ai essayé de compiler ma solution C # dans Visual Studio 2010 sous Windows XP. Un projet comportait un nombre non négligeable de ressources intégrées (la taille de l’Assemblée résultante était d’environ 140 Mo) et je n’ai pas pu compiler la solution, car j’obtenais le
Pas assez de stockage est disponible pour terminer cette opération
erreur dans ma sortie de construction.
Aucune des réponses à cette question n'a aidé, mais j'ai trouvé une réponse à " Il n'y a pas assez de mémoire disponible pour terminer cette opération " de ScottBurton42 sur social.msdn.Microsoft.com. Il suggère d'ajouter le commutateur 3GB
au fichier Boot.ini
et de rendre devenv.exe
large-address capable. L'ajout du commutateur 3GB
à mon fichier Boot.ini
a fonctionné de manière satisfaisante (je pense que devenv.exe
pour Visual Studio 2010 et versions ultérieures est déjà compatible avec les adresses de grande taille).
Ma réponse est basée sur cette réponse.
Solution 1: activez le commutateur /3GB
Boot.ini
La page Prise en charge de la mémoire et systèmes d’exploitation Windows sur MSDN indique:
L'espace d'adressage virtuel des processus et des applications est toujours limité à 2 Go sauf si le commutateur
/3GB
est utilisé dans le fichierBoot.ini
.Le commutateur
/3GB
alloue 3 Go d'espace d'adressage virtuel à une application qui utiliseIMAGE_FILE_LARGE_ADDRESS_AWARE
dans l'en-tête du processus. Ce commutateur permet aux applications d'adresser 1 Go d'espace d'adressage virtuel supplémentaire supérieur à 2 Go.L'espace d'adressage virtuel des processus et des applications est toujours limité à 2 Go, sauf si le commutateur
/3GB
est utilisé dans leBoot.ini file
. L'exemple suivant montre comment ajouter le paramètre/3GB dans le fichierBoot.ini
pour activer le réglage de la mémoire de l'application:[boot loader] timeout=30 default=multi(0)disk(0)rdisk(0)partition(2)\WINNT [operating systems] multi(0)disk(0)rdisk(0)partition(2)\WINNT="????" /3GB
Remarque "
????
" dans l'exemple précédent est le nom de programme du système d'exploitation.
Sous Windows XP, le fichier Boot.ini
peut être modifié en allant à
La page sur le /3GB
switch sur MSDN indique:
Sur les versions 32 bits de Windows, le paramètre
/3GB
permet d'activer le réglage 4 GT RAM, une fonctionnalité qui agrandit l'espace d'adressage virtuel en mode utilisateur à 3 Go et limite les composants en mode noyau aux 1 Go restants.Le paramètre
/3GB
est pris en charge sur Windows Server 2003, Windows XP et Windows 2000. Sous Windows Vista et les versions ultérieures de Windows, utilisez l'élémentIncreaseUserVA
dansBCDEdit
.
Le redémarrage de la machine entraînera alors la prise en compte du paramètre.
Solution 2: Rendre devenv.exe
adresse large sensible:
Ouvrez une invite de commande Visual Studio (ou une invite de commande du développeur, selon la version de Visual Studio).
Tapez et exécutez la ligne de commande suivante:
editbin /LARGEADDRESSAWARE {path}\devenv.exe`
où {path}
est le chemin d'accès à devenv.exe
(vous pouvez le trouver en accédant aux propriétés du raccourci Visual Studio).
Cela permettra à devenv.exe
d'accéder à 3 Go de mémoire au lieu de 2 Go.
Nettoyer et reconstruire la solution a fonctionné pour moi
Dans mon cas, il me restait très peu de mémoire dans le lecteur C. J'ai effacé quelques éléments du lecteur C et réessayé. Ça a marché.
Je pourrais être en retard pour répondre, mais pour référence future, vous voudrez peut-être vérifier les paramètres du fichier de vidage Windows (et probablement le définir sur aucun).
Dans mon cas, le serveur sur lequel j'exécutais le code ne pouvait pas gérer mon code parallélisé.
Normalement, je lance une configuration comme celle-ci
new ParallelOptions { MaxDegreeOfParallelism = Math.Max(1, Environment.ProcessorCount / 2) }
L’introduction d’une variable et l’autorisation du verrouillage des cœurs utilisés à 1 (ce qui donne un code semblable à celui-ci) ont résolu ce problème.
new ParallelOptions { MaxDegreeOfParallelism = 1 }
Je suis en retard pour répondre mais cela peut être utile pour d'autres.
La clé pour moi: Nous avions intégré un énorme modèle de base de données (les tests l'avaient rempli avec beaucoup de données) dans l'application. Je n'ai pas vu ce problème se produire depuis la suppression correcte de Embedded Resource et le déplacement de la base de données dans un dossier de recours.
Mon résoudre ce problème avec supprimer ou désactiver (exclure) les fichiers * .rpt qui ont une grande taille, et j'ai optimiser les rapports!