큰 프로젝트를 관리하고 있고 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();
}
}
}
}
}
:
응용 프로그램이 'x86', 'x64'또는 'Any CPU'용으로 빌드되어 있습니까? 빌드 플랫폼이 x86 인 경우 64 비트 환경이지만 x64로 실행되는 경우 더 많은 메모리에 액세스 할 수 있지만 .net 응용 프로그램은 32 비트 프로세스로 실행됩니다. –
x86이기 때문에 변경할 수 없습니다. 하지만 여전히 130 메가 개체이므로 x86 메모리 제한을 초과하지는 않습니다. –
32 비트에서 할당 할 수있는 연속 * 메모리의 실제 제한은 2GB 이론적 제한보다 훨씬 적습니다. 예를 들어 http://stackoverflow.com/questions/2415434/the-limitation-on-the-size-of-net-array/2415472#2415472를 참조하십시오. 이 코드를 어떤 종류의 변화로 만들 수 있습니까? 문자열을 반환해야합니까? 다른 뭔가가 될 수 있을까요? – dbc