2008-11-05 104 views
8

我需要關於如何在Delphi(我使用Delphi 2009)中儘可能快地處理非常大的XML文件(例如100 MB)的建議。Delphi中對於非常大的文檔的最快XML處理

我需要輸入XML,從我的程序中訪問並更新其中的數據,然後再導出修改後的XML。

希望輸入和輸出可以在幾秒鐘內在快速Windows機器上完成。


澄清。我期望我將需要使用DOM,因爲訪問用於開發報表和更新數據的數據結構非常重要,而且我需要這個功能非常快。

只有輸入一次才能完成文件加載,輸出只能完成文件保存,通常只需退出一次即可。這些應該也很快,但不像內存中的數據訪問和更新那麼重要。

我的理解是,第三方解析器只能幫助輸入和輸出,而不能在加載到內存中時使用和修改數據。或者我誤解了這一點?

回答

8

如果我理解正確你的問題,你已經知道的數據結構和要修改的數據 - 而不是文件的XML結構。

在這些條件下如果性能至關重要,那麼您可以嘗試直接文本處理 - 跳過XML解析。

從流中讀取,使用一些快速文本搜索算法,例如Boyer-Moore,查找需要修改數據的位置,進行修改並將數據輸出到另一個流。

這將是一次性的,沒有XML解析,沒有內存中的XML樹的構建。

+0

實際上,當程序啓動時,我想將數據輸入到內存中的數據結構。然後,在運行時,我將多次訪問該數據以進行各種操作,包括允許用戶更新數據。在結束時,用戶可能會想要保存他的更新。 – lkessler 2008-11-05 16:06:25

2

我不是專家,但我相信的共識是,SAX解析器將遠遠比DOM更有效率......

3

你可能想看看DIHtmlParser component from The Delphi Inspiration。它應該是「非常快,特別是在解析大文件時」,並且「在現代機器上,每秒的分數高達15 MB以上」。我已經有了一些相當不錯的體驗,雖然我從來沒有用大文件試過它。

+0

我已經在非常大(> 100 MB)的XHTML日誌文件上使用了這個功能,沒有任何問題。 – skamradt 2008-11-05 13:12:16

5

SAX值得考慮,而不是DOM解析器。

使用DOM您需要支付加載文檔的開銷,但一旦加載的數據可以被快速訪問和更新。

使用SAX,您必須爲begin-element,end-element等編寫處理程序,但您在進行的操作中擁有更大的靈活性。

雖然它可能不利於你的情況,SAX是您正在搜索,因爲你可以在任何時候暫停解析,所以一旦你找到你想要的東西,你可以停止非常有用的。

如果你的程序不需要在它知道要做什麼修改之前就已經解析了所有的數據,你可以編寫SAX處理程序,它只是在讀取數據時更新數據,否則它會傳遞數據,而不必將其全部加載到任何類型的存儲器結構中。這將使解決方案非常具有可擴展性,因爲您不會遇到內存限制非常大的文件。

對於它的價值,我傾向於使用MSXML DOM和SAX解析器。可以說,他們是不是最好的表演,我認爲有可能是更多的人改善他們的工作,所以他們會越來越好。

4

我對SimDesign的NativeXML非常滿意。它還包括一個名爲FastXML特殊版本,這我還不測試,但是被告知要,好,快。

0

我剛剛發現的另一種可能性是我購買的LMD ElPack package,它們包含一個XML支持庫,他們聲稱「它非常快速,完全支持Unicode,並且只爲您的Exe-files增加了一小部分空間」。

查看LMD 7包(對於Delphi 2009)中包含的LMDXML.pas單元的源代碼,它說代碼基於Michail Vlasov的SimpleXML 8.0版(2006年7月)代碼。

0

如果你只需要直接操作,我會同意zendar的答案。

至於DOM或SAX的實施,我會推薦DIXml