2016-10-16 10 views
0

큰 프로젝트를 관리하고 있고 XML 형식의 개체를 serialize하고 보내야합니다. 객체는 ~ 130MB입니다.큰 개체를위한 C# serialization xmlwriter stringwriter 메모리 부족

(참고 :이 프로젝트를 작성하지 않았으므로이 메서드 외부에서 편집하거나 아키텍처를 크게 변경하는 것은 옵션이 아닙니다. 정상적으로 작동하지만 개체가 클 경우 메모리가 부족합니다. . 예외는 내가 그것을 큰 개체를 처리하는 다른 방법을 할 필요)

현재의 코드는 다음과 같습니다. 그것은 바로에 ReturnValue = writer.ToString에서 메모리 부족 예외를 던지고있다

public static string Serialize(object obj) 
{ 
    string returnValue = null; 

    if (null != obj) 
    { 
     System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); 

     XDocument document = new XDocument(); 

     System.IO.StringWriter writer = new System.IO.StringWriter(); 
     System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer); 

     formatter.WriteObject(xmlWriter, obj); 
     xmlWriter.Close(); 

     returnValue = writer.ToString(); 
    } 

    return returnValue; 
} 

().

나는 그것이 내가 원하는 블록 "을 사용하여"사용하여 재 작성 :이 연구

public static string Serialize(object obj) 
    { 
     string returnValue = null; 
     if (null != obj) 
     { 
      System.Runtime.Serialization.DataContractSerializer formatter = new System.Runtime.Serialization.DataContractSerializer(obj.GetType()); 
      using (System.IO.StringWriter writer = new System.IO.StringWriter()) 
      { 
       using (System.Xml.XmlTextWriter xmlWriter = new XmlTextWriter(writer)) 
       { 
        formatter.WriteObject(xmlWriter, obj); 
        returnValue = writer.ToString(); 
       } 
      } 
     } 
     return returnValue; 
    } 

를, StringWriter를에 ToString 메서드는 실제로 두 배의 RAM을 사용하여 나타납니다. (실제로 4GB 이상의 RAM을 무료로 가지고 있으므로 메모리 오류가 발생하는 이유를 알 수 없습니다.) 지금은 어느 나는 것 또 다른 문제가있다, 물론

public static void Serialize(object obj, FileInfo destination) 
{ 
    if (null != obj) 
    { 
     using (TextWriter writer = new StreamWriter(destination.FullName, false)) 
     { 
      XmlTextWriter xmlWriter = null; 
      try 
      { 
       xmlWriter = new XmlTextWriter(writer); 
       DataContractSerializer formatter = new DataContractSerializer(obj.GetType()); 
       formatter.WriteObject(xmlWriter, obj); 
      } 
      finally 
      { 
       if (xmlWriter != null) 
       { 
        xmlWriter.Flush(); 
        xmlWriter.Close(); 
       } 
      } 
     } 
    } 
} 

:

+0

응용 프로그램이 'x86', 'x64'또는 'Any CPU'용으로 빌드되어 있습니까? 빌드 플랫폼이 x86 인 경우 64 비트 환경이지만 x64로 실행되는 경우 더 많은 메모리에 액세스 할 수 있지만 .net 응용 프로그램은 32 비트 프로세스로 실행됩니다. –

+0

x86이기 때문에 변경할 수 없습니다. 하지만 여전히 130 메가 개체이므로 x86 메모리 제한을 초과하지는 않습니다. –

+0

32 비트에서 할당 할 수있는 연속 * 메모리의 실제 제한은 2GB 이론적 제한보다 훨씬 적습니다. 예를 들어 http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array/2415472#2415472를 참조하십시오. 이 코드를 어떤 종류의 변화로 만들 수 있습니까? 문자열을 반환해야합니까? 다른 뭔가가 될 수 있을까요? – dbc

답변

0

글쎄, 나는 최선의 해결책 대신에 따라 문자열을 전달하는 직접, 다음, 내가 파일을 전달할 파일로 직렬화하는 것이었다 발견 게시물 ... 그리고 그 파일을 deserializing입니다!

+0

'xmlWriter'도 삭제해야합니다. –

+0

XmlWriter는 IDisposable 개체가 아닙니다. –

+0

[1] (https://msdn.microsoft.com/en-us/library/system.xml.xmlwriter (v = vs.110) .aspx), [2] (https://msdn.microsoft.com /en-us/library/system.xml.xmlwriter.dispose(v=vs.110).aspx). –