2010-06-10 5 views
0

J'utilise la bibliothèque System.Security.Cryptography pour chiffrer et déchiffrer des fichiers xml. Récemment, j'ai reçu des exceptions OOM (Out of Memory) en essayant de déchiffrer un fichier de 75Mo. Voici le code que je utilise:Exception "Mémoire insuffisante" lors du déchiffrement d'un fichier XML

using System.Security.Cryptography.Xml; 
    ... 
    public static XmlDocument DecryptIntoXmlDoc(string filename) 
    { 
     //Decrypt the XML 
     XmlDocument xmldoc = new XmlDocument(); 
     EncryptedXml exml = new EncryptedXml(xmldoc); 
     TripleDESCryptoServiceProvider ekey = new TripleDESCryptoServiceProvider(); 
     ASCIIEncoding encoding = new ASCIIEncoding(); 

     ekey.Key = encoding.GetBytes(GetMasterKey()); 
     exml.AddKeyNameMapping("ekey", ekey); 
     xmldoc.Load(filename); 

     // -- THROWS THE OOM ERROR -- 
     exml.DecryptDocument(); 

     //Clear exml 
     exml = null; 

     return xmldoc; 
    } 

Dès .DecryptDocument() est appelée, je reçois l'erreur suivante:

Exception of type 'System.OutOfMemoryException' was thrown. 

Je n'ai pas été en mesure de trouver quelqu'un d'autre ayant ce problème , mais j'ai lu que si les balises xml ne sont pas correctement nommées/imbriquées, le fichier peut être très volumineux lorsqu'il est chargé en mémoire. Le fait de renommer mes balises XML en noms plus courts réduirait-il la taille? Existe-t-il un moyen d'imbriquer des balises xml pour réduire la taille du fichier?

Y at-il autre chose que je pourrais faire?

Répondre

0
  • exécuter votre programme sous le débogueur
  • Lorsque l'exception OOM est levée, mettre en pause et examiner le graphe d'objet ancré à exml. Qu'est-ce qui occupe réellement la plus grande partie de la mémoire?

Les chaînes immuables sont probablement le tueur ici, car certains analyseurs XML peuvent se retrouver en gardant votre doc entier en mémoire plusieurs fois.

+0

Je suis nouveau à l'examen des problèmes de mémoire dans .NET, où est le «graphique de l'objet»? – Nefariousity

+0

@Nefariousity, c'est l'arbre des objets référencé par un objet donné. Dans le débogueur VS, vous devez ajouter 'exml' à la liste de surveillance, puis développer récursivement tous ses membres sur quelques niveaux pour avoir une idée du type de données qu'il contient. –

+0

Ooooh. Je t'ai. Eh bien, il semble que le xmldocument lance un message OOM avant que l'exml ne le soit. Pensez-vous que renommer/restructurer le XML réduirait la taille du fichier? La compression pourrait-elle aider? – Nefariousity

Questions connexes