2011-04-19 3 views
0

나는 광범위하게 검색하여 내 문제에 대한 해결책을 찾을 수 없었습니다.XML 직렬화 및 파일에 대한 쓰기 처리 방법

프로세스가 점차 메모리를 먹어 치우는 전형적인 상황이 있습니다. 프로세스는 결국 OutofMemory Exception을 던집니다. 이 문제는 과거에는 더 큰 메모리를 가진 특별한 기계를 만드는 것으로 처리되었습니다.

이 프로세스는 약 450,000 개의 레코드가있는 고객 중 한 명만 공격합니다. 우리는 계정 컬렉션을 반복하고 클래스 개체를 작성한 다음 xml serializer로 전달합니다. 이 객체에는 동시에 채워지지 않는 여러 속성과 메서드가 있습니다. 이러한 개체는 각 계정 레코드의 정보를 기반으로 채워집니다.

우리는 XML 직렬화기를 위해 생성자를 호출하는 방법을 확인했으며 XML 어셈블리를 저장할 때마다 새로운 것을 만들지는 않습니다. 따라서 동적 어셈블리 생성으로 인해 메모리 누수가 발생한다고 생각하지 않습니다. 우리는 시리얼 라이저를 호출하는 방법

: 새로운 XmlSerializer가 희미한 k1Serializer (GetType을 (ClassObject))

내 질문은 :

큰 객체를 직렬화 가능한 모든 직렬화 객체 또는 단지의 시리얼 모양을 수행 개체에 의해 채워지는 것들?

이 대형 클래스 객체의 직렬화로 인해 문제가 발생할 수 있습니까?

직렬화 된 객체를 전달할 때 알아 차렸지만 지정된 파일에 자동으로 기록되지 않습니다. 객체를 직렬화 한 다음 작성하는 데 몇 초가 걸립니다. 우리가 너무 많은 레코드를 순식간에 반복하고 있다는 사실은 시리얼 라이저가 파일을 쓰고 메모리를 해제 할 충분한 시간이 없다는 것입니다.

나는 정말 재능이있어 끝내 주면 도움이 될 것입니다. 다른 정보가 필요한지 알려주십시오.

감사

+0

더 많은 실제 코드를 보여줄 수 있으며, serializer를 호출하는 방법과 * *로 serialize하는 것을 보여줄 수 있습니다. – Cheeso

답변

0

로드 단지 나에게 좋은 생각으로 보이지 않는 XML 파일로 그것을 기록하는 동시에 메모리에 45 만 개 기록. 필자는 XML Serializer 대신 XMLWriter를 사용하여 기능을 다시 설계하는 것이 좋습니다. 이렇게하면 전체 정보 집합을 동시에 메모리에 보관할 필요가 없습니다.

+0

개체 배열에 450,000 개의 레코드를로드 한 다음 필요한 데이터로 개체를 채운 다음 각 개체를 XML serializer로 전달합니다. 미안 내가 첫 번째 게시물에서 명확하게하지 않은 경우. – user715984

-1

XmlTextWriter을 살펴보십시오. 을 수동으로 입력 할 수 있습니다.은 XmlSerializer 인 블랙 박스에 의지하지 않고 데이터에 대한 XML 데이터를 작성합니다.

항목의 목록을 반복하고, XML 파일로 그들을 작성하기위한 간단한 예 :

var settings = new System.Xml.XmlWriterSettings 
{ 
    OmitXmlDeclaration = true, 
    Indent= true 
};  
string myXmlNamespace = "urn:myXmlNamespace"; 
using (var fileStream = 
    new FileStream("MyFile.xml", FileMode.Create, FileAccess.Write, FileShare.None)) 
{ 
    using (XmlWriter w = XmlWriter.Create(fileStream, settings)) 
    { 
    w.WriteStartElement("root", myXmlNamespace); 
    for (var elt in myCollection) 
    { 
     w.WriteStartElement("elt",myXmlNamespace); 
     w.WriteElementString("prop1",myXmlNamespace,elt.Property1); 
     w.WriteElementString("prop2",myXmlNamespace,elt.Property2); 
     w.WriteEndElement(); 
    } 
    } 
} 

당신은 "드 - 직렬화"에 대한 반대를해야 할 것입니다. 파일 스트림을 연 다음 XmlTextReader()를 사용하여 XML을 읽고 요소를 인스턴스화하여 컬렉션에 추가합니다.

+0

-1 아니요,'XmlWriter.Create'를 사용하십시오. 'XmlTextWriter'는 .NET 2.0부터 사용되지 않습니다. –

+0

아, 알았어. 나는 지금 그것을 기억한다. 내 방어, XmlTextWriter에 대한 문서 페이지 여전히 생성자를 사용하여 예제를 보여줍니다. – Cheeso

+0

XmlWriter를 사용하여 XML 직렬화기를 전달합니다. 우리는 많은 개체를 채워야하기 때문에 serializer를 사용하며, XmlWriter를 사용하기위한 전체 프로세스를 다시 작성하는 것이 현재로서는 큰 해결책이되지 않을 것이라고 생각합니다. 나중에 우리의 프로세스를 다시 작성하는 계획을 가지고 있습니다. XML Serializer를 처음부터 사용하는 것은 좋지 않습니다. serializer를 사용하여 매번 startelement, endelement 등을 작성하는 것에 대해 걱정할 필요가 없습니다. – user715984