2010-06-10 10 views
0

XML 파일을 암호화하고 해독하기 위해 System.Security.Cryptography 라이브러리를 사용하고 있습니다. 최근에 75MB 파일의 암호를 해독하려고 시도하는 중 OOM (Out of Memory) 예외가 발생했지만 최근에. 나는 다른 사람이 문제가를 찾을 수 없어XML 파일을 암호 해독 할 때 "메모리 부족"예외가 발생했습니다.

Exception of type 'System.OutOfMemoryException' was thrown. 

: 즉시 .DecryptDocument이() 나는 다음과 같은 오류가 불리는

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; 
    } 

: 여기에 내가 사용하고 코드입니다 ,하지만 XML 태그가 제대로 명명 된/중첩되지 않은 경우 파일을 메모리로로드 될 때 매우 커질 수 있습니다 읽었습니다. XML 태그의 이름을 더 짧은 이름으로 변경하면 크기가 줄어 듭니까? XML 태그를 중첩하여 파일 크기를 줄이는 방법이 있습니까?

내가 할 수 있는게 더 있습니까?

답변

0
  • exml 루트 객체 그래프를, 디버거 움 예외가 발생
  • 아래 프로그램을 실행 중지 및 검사합니다. 실제로 대부분의 메모리를 차지하고있는 것은 무엇입니까?

일부 XML 파서가 전체 문서를 여러 번 메모리에 보관할 수 있기 때문에 불변의 문자열이 여기에 있습니다.

+0

.NET의 메모리 문제를 처음 보았습니다. '객체 그래프'는 어디에 있습니까? – Nefariousity

+0

@Nefariousity, 그것은 주어진 객체에 의해 참조되는 객체의 트리입니다. VS 디버거에서 watchlist에'exml'을 추가 한 다음 몇 개의 레벨에 대한 모든 멤버를 재귀 적으로 확장하여 어떤 종류의 데이터를 보유하고 있는지 파악하십시오. –

+0

우. 잡았다. exml이 나오기 전에 xmldocument가 OOM 메시지를 던지고있는 것처럼 보입니다. XML의 이름을 바꾸거나 XML을 재구성하면 파일 크기가 줄어들 것이라고 생각하십니까? 압축이 도움이 될 수 있습니까? – Nefariousity