web-dev-qa-db-fra.com

Pas assez de stockage est disponible pour terminer cette opération

Environnement:

  • Visual Studio Ultimate 2010
  • Windows XP
  • Application de bureau WPF utilisant .NET 4.0

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?

18
Ranjith Venkatesh

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.

14
user527987

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? 

7
Daniel Dyson

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 /3GBBoot.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 fichier Boot.ini.

Le commutateur /3GB alloue 3 Go d'espace d'adressage virtuel à une application qui utilise IMAGE_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 le Boot.ini file. L'exemple suivant montre comment ajouter le paramètre/3GB dans le fichier Boot.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 à

  • Propriétés du système → Avancé → Démarrage et récupération → Paramètres → Démarrage du système → Modifier

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ément IncreaseUserVA dans BCDEdit.

Le redémarrage de la machine entraînera alors la prise en compte du paramètre.


Solution 2: Rendre devenv.exe adresse large sensible:

  1. Ouvrez une invite de commande Visual Studio (ou une invite de commande du développeur, selon la version de Visual Studio).

  2. Tapez et exécutez la ligne de commande suivante:

    editbin /LARGEADDRESSAWARE {path}\devenv.exe`
    

    {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.

5
Wai Ha Lee

Nettoyer et reconstruire la solution a fonctionné pour moi

3
Ashkan Ghodrat

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é.

1
Gayathri Ramaswamy

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).

1
6pack kid

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 }
1
Squazz

Je suis en retard pour répondre mais cela peut être utile pour d'autres.

0
Imran Ali Khan

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.

0
Barton

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!

0
Yousef Shakouri