2010-06-22 35 views
1

我有一個約500 MB的XML文件,我用C#使用LINQ查詢該文件,但它非常慢,因爲它將所有內容加載到內存中。無論如何,我可以查詢該文件,而無需全部加載到內存中?LINQ如何從大型XML文件中搜索數據?

謝謝

回答

0

不,使用Linq時不可能。 Linq將全部xml的模型加載到內存中,以便您可以使用樹結構進行訪問。 如果你想快速訪問而不加載文件到內存中,你可以使用XmlReader類。 該類爲您提供了一個快速只進xml解析器,它只包含內存中的當前節點。

下面是一些幫助:http://support.microsoft.com/kb/307548

編輯:對不起,不知道其可能的XMLReader使用LINQ結合。

+0

您可以將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

0

可以使用約XNode.ReadFrom MSDN的頁面上所描述的技術產生的XNode秒的IEnumerable的(在他們提供的,XElement S中的例子)從XmlReader

注意,當您從StreamXmlReader閱讀XElement,該元素的全部內容也必須進行閱讀 - 所以你仍然需要自定義邏輯在IEnumerator的邏輯一點點,以確保正確的返回XElements - 例如,如果返回根元素,那麼您可能會立即解析整個文檔,因爲根元素總是包含幾乎顛倒過來的東西。 XNode.ReadFrom示例也包含這樣的邏輯。

+0

sounds非常艱難。我很樂意看到有一天這樣的例子。 – 2010-06-22 11:49:18

2

This article應該讓你啓動並運行。看看SimpleStreamAxis方法,這對於查找大型XML文件中的節點非常方便。我已經成功地在5GB XML文件上使用了這種方法的一個變體,而無需將文件加載到內存中。