2011-04-19 45 views
0

我已搜查甚廣,並沒有能夠找到一個解決我的問題。XML序列化,它處理如何寫出一個文件

我有一個典型的情況,其中的過程是逐步蠶食內存。該進程最終拋出OutofMemory異常。過去只是建立一個具有更大內存的特殊機器來解決這個問題。

這個過程只對我們的客戶有炸彈,這個客戶有大約450,000條記錄。我們迭代帳戶的集合並構建一個類對象,然後將其傳遞給xml序列化程序。這個對象有幾個屬性和方法不會同時被填充。這些對象根據每個帳戶記錄中的信息填充。

我已經檢查過我們爲XML序列化程序調用構造函數的方式,它的格式是存儲xml程序集並且不會每次都創建新程序集。所以,我不相信由於創建動態程序集而導致內存泄漏。

我們怎麼叫串行:昏暗k1Serializer作爲新的XmlSerializer(的GetType(ClassObject))

我的問題是:

當序列化大對象,確實串行看看每一個可能的序列化對象或只是那些由你的對象填充的那些?

這個大類對象的序列化是否會導致問題?

我注意到當我們傳入序列化對象時,它不會自動寫出到指定的文件中。我猜想,需要幾秒鐘,序列化對象,然後寫出來。實際上,我們正在迭代這麼多記錄,這麼快,序列化程序沒有足夠的時間寫出文件並釋放內存?

我真的在我的智慧結束,任何幫助將不勝感激。請讓我知道是否需要其他信息。

感謝

+0

可以顯示更多的實際的代碼,說明你如何調用序列化,和你有什麼序列化到* *。 – Cheeso 2011-04-21 20:34:43

回答

0

加載45萬個記錄在同一時間內存只是寫出來到一個XML文件不看是一個好主意,我。我建議你重新設計使用XMLWriter的,而不是XML序列化,這樣整套的信息不必在同一時間保存在內存中的功能。

+0

我們通過這些對象提供必要的數據填充它們,然後使每個對象轉換成XML序列450,000的記錄加載到對象的數組,然後循環。對不起,如果我沒有在第一篇文章中說清楚。 – user715984 2011-04-20 18:44:50

-1

考慮看看XmlTextWriter。您可以手動寫出來的XML數據爲你的數據,而不訴諸是XmlSerializer的黑盒。

通過項目列表迭代,寫出來到一個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'。從.NET 2.0開始,XmlTextWriter已被棄用。 – 2011-04-21 20:24:12

+0

啊,好吧。我現在記得那個。在我的辯護中,XmlTextWriter的文檔頁面仍然使用構造函數顯示示例。 – Cheeso 2011-04-21 20:26:33

+0

我們使用XmlWriter傳入XML序列化程序。我們使用序列化程序,因爲我們必須填充許多對象,並且我覺得重寫整個過程以使用XmlWriter並不是一個好的解決方案。我們計劃在未來稍後重寫我們的流程。開始使用XML序列器是一個糟糕的選擇。通過使用序列化程序,我不必擔心每次寫出startelement,endelement等。 – user715984 2011-04-21 20:28:01