2013-06-28 21 views
-1

我遇到了問題,需要幫助。我需要保存一個約400MB的XML文件。我爲此使用了System.Xml.Linq.XDocument.Save()。通常情況下這是沒有問題的,但有時我得到了一個奇怪的行爲,System.Xml.Linq.XDocument.Save()確實將XML-Data保存在同一個XML中的無限循環中,直到硬盤驅動器崩潰。再次採用相同的XML數據,並沒有問題,一切正常。所以直到現在,再現這種行爲是不可能的!System.Xml.Linq.XDocument.Save()導致完整的硬盤

我得到一個新的服務器,現在這是我得到的唯一結果,每次調用System.Xml.Linq.XDocument.Save()時!它是絕對可再現......這裏是新environement

  • .Net框架4(也4.5)
  • 的Windows Server 2008 R2 SP1標準
  • 32 GB內存
  • 64位
  • 所有更新已安裝

感謝您的幫助!


這裏是代碼片段:

xmlImp = new XDocument(
    new XDeclaration("1.0", null, null), 
    new XDocumentType("Hotelstamm", null, "hotel.dtd", null), 
    HotelStamm); 

string pathUTF8 = path.Replace(".xml", "-utf8.xml"); 
try 
{ 
    xmlImp.Save(pathUTF8); 
} 
catch (IOException) 
{ 
} 

編輯:

的問題是,我們在多線程和的XElement的。新增-方法創建的XML的結構是不是線程-安全。如果它在多個線程中調用,則會損害Xml-Stucture,並且Xml開始變得無限。

問題是,我們的舊服務器上的應用程序運行良好,約95%。但是在新的方面,它只有5%的成功機會。
在舊的服務器上有3次嘗試的sinpmle循環使其工作。但現在鎖定它工作正常。

+2

如果它的可重現性,告訴我們如何重現它。據推測,你沒有聲明任何具有該規範的機器上的'XDocument.Save()'調用會表現出這種行爲,或者你呢? – Jodrell

+0

我很悲觀,這是一個通用的問題,會影響所有具有該規格的機器,我猜測它更可能是該特定版本的問題。但是,我沒有使用具有該規範的計算機上的'XDocument.Save()'來保存400MB XML文件的經驗。因此,我無法證實我的懷疑。 – Jodrell

+0

@Jodrell:那麼,所有的服務器幾乎是一樣的:alle 2008 R2,全部32 GB RAM,全部64Bit。他們都運行相同的運行時版本。 以下是代碼片段: 'XmlImp = new XDocument( new XDeclaration(「1。0「,null,null), new XDocumentType(」Hotelstamm「,null,」hotel.dtd「,null), HotelStamm); string pathUTF8 = path.Replace(」。xml「,」-utf8.xml 「); 嘗試 { XmlImp.Save(pathUTF8);} 抓 (IOException異常ioEx)' –

回答

2

重新檢查代碼,我注意到您正在使用XDocument ctor的this overload

如果傳遞給構造函數的變量HotelStamm包含複雜的循環關係,則可能是它不能在分層XML中有限地表示。

您可以嘗試列舉xmlImp.Descendants()並查看您是否獲得相同的種族行爲。

如果是這樣,你有一個問題的循環關係,你需要簡化。請注意,這與代碼運行的機器規格沒有直接關係。

+0

非常感謝,事實上它是XML Strukture。已解決! –

+0

問題是我們在多個線程中創建了Xml-Structure,而.Add- XElem的方法ent不是線程安全的。如果它在多個線程中調用,則會損害Xml-Stucture,並且Xml開始變得無限。 –