我有一個約500 MB的XML文件,我用C#使用LINQ查詢該文件,但它非常慢,因爲它將所有內容加載到內存中。無論如何,我可以查詢該文件,而無需全部加載到內存中?LINQ如何從大型XML文件中搜索數據?
謝謝
我有一個約500 MB的XML文件,我用C#使用LINQ查詢該文件,但它非常慢,因爲它將所有內容加載到內存中。無論如何,我可以查詢該文件,而無需全部加載到內存中?LINQ如何從大型XML文件中搜索數據?
謝謝
不,使用Linq時不可能。 Linq將全部xml的模型加載到內存中,以便您可以使用樹結構進行訪問。 如果你想快速訪問而不加載文件到內存中,你可以使用XmlReader類。 該類爲您提供了一個快速只進xml解析器,它只包含內存中的當前節點。
下面是一些幫助:http://support.microsoft.com/kb/307548
編輯:對不起,不知道其可能的XMLReader使用LINQ結合。
可以使用約XNode.ReadFrom
MSDN的頁面上所描述的技術產生的XNode
秒的IEnumerable的(在他們提供的,XElement
S中的例子)從XmlReader
。
注意,當您從Stream
或XmlReader
閱讀XElement
,該元素的全部內容也必須進行閱讀 - 所以你仍然需要自定義邏輯在IEnumerator的邏輯一點點,以確保正確的返回XElements - 例如,如果返回根元素,那麼您可能會立即解析整個文檔,因爲根元素總是包含幾乎顛倒過來的東西。 XNode.ReadFrom
示例也包含這樣的邏輯。
sounds非常艱難。我很樂意看到有一天這樣的例子。 – 2010-06-22 11:49:18
This article應該讓你啓動並運行。看看SimpleStreamAxis
方法,這對於查找大型XML文件中的節點非常方便。我已經成功地在5GB XML文件上使用了這種方法的一個變體,而無需將文件加載到內存中。
您可以將XmlReader與LINQ結合使用:http://blogs.msdn.com/b/xmlteam/archive/2007/03/24/streaming-with-linq-to-xml-part-2.aspx – spender 2010-06-22 11:55:26