2011-05-05 93 views
4

我有一組的哪個索引大型XML文件(鏈接到MediaWiki轉儲文件),並使用這些的indeces對隨機存取存儲在文件中的單個記錄工具。它工作得很好,但我用字符串函數和/或正則表達式「解析」XML,而不是真正的XML解析器,這是一個脆弱的解決方案,應該在將來改變文件的創建方式。大的XML文件隨機存取

做一些或大多數XML解析器有辦法做這樣的事情?

(我有我的C語言編寫的,Perl和Python工具版本。解析整個文件轉換成某種數據庫或將它們映射到內存中沒有選項)。

UPDATE

這裏是粗略的統計比較:我使用的文件大多每週發佈一次,目前的文件大小爲1,918,212,991字節。我的索引工具的C版本在我的上網本上花費了幾分鐘,並且只需爲每個發佈的新XML文件運行一次。不經常我使用其當前大小爲30565654976個字節,並於2010

回答

1

VTD-XML看起來是在解決這一問題的第一次認真的嘗試:

世界上最節省內存(1.3倍〜1.5倍的XML文檔的大小)隨機存取XML解析器

(VTD-XML即使在這裏,在計算器上擁有自己的標籤,所以你可以按照它等questins:

+1

我想知道爲什麼在一年之內沒有人評論過這個答案。這個用例非常罕見嗎?這對你來說有效嗎@hippietrail? – fho 2014-02-27 11:33:28

+0

@弗洛裏安:我從來沒有嘗試過。當時我正在使用的編程語言中沒有實現/庫/膠水,維基百科XML轉儲文件的格式仍然沒有改變,無法與我以前的簡單化方法一起使用。但我同意你的看法,在這裏似乎沒有人提到這樣的用例... – hippietrail 2014-02-27 12:48:01

+0

也許這只是選擇正確的工具的正確工具的問題。 XML在隨機訪問*和*大文件的同時並不是很好。 Otoh如果我只有一大堆XML,如果我被要求在這些文件中提供隨機訪問,我沒有多少選擇。購買更多內存和使用DOM被考慮,但最終我們在多臺計算機上創建了大型文件,購買更多內存只是延遲了這個問題。 – fho 2014-02-27 13:18:25

0

XML進行了更新只有8次是結構化的格式另一個XML文件相同的工具。因此隨機存取沒有真正太大的意義 - 你必須知道你要去哪裏。

正則表達式也需要被加載到存儲器中的整個字符串。這比DOM更好,因爲DOM通常比XML文件的大小多3-4倍的內存。

對於這些情況的典型解決方案是SAX當這些有一個非常小內存足跡,但他們就像一個只進遊標:因此你不是隨機訪問,你必須遍歷樹來得到你需要。如果您使用.NET,則可以使用XmlTextReader

指數也很有用,如果XML不因爲創建這些指數可以是昂貴的經常更新。

+1

如果真的就沒有太大的意義,比爲什麼會W3放這麼多努力定義XML的二進制表示的隨機訪問?參見(除其他外)http://www.w3.org/TR/xbc-properties/#random-access; – Abel 2012-03-10 14:17:23

-1

XPath是遠遠大於串/正則表達式「解析」更好,但XPath的工作原理與XML文檔被解析到內存中的DOM首先,如果您的文件是真正的大,你可能會得到內存問題。

1

我想你應該存儲這些數據以XML數據庫如存在-DB,而不是創建自己的工具做什麼XML數據庫給你一個非常小的子集。

+0

你能給一些理由嗎?我不需要做的事情超過一小部分。我將閱讀這個存在的數據庫,但它會如何比較速度?顯然這至少意味着所需的存儲空間翻一番。 – hippietrail 2011-05-05 14:29:53

1

如果你正在使用Python,嘗試LXML - 這是非常快速和靈活,並且它會比較不錯用正則表達式的速度。用任何語言比替代品快得多 - 毫不妥協。

使用iterparse步驟通過維基百科的文章。

請注意,這不會給你的轉儲文章的隨機訪問(這是一個完全合理的請求!) - 但iterparse會給你一個快速和易於使用的'只進'遊標...和lxml可能是通過其他方式解析塊fseek'd的正確工具。

下面是我爲它找到了最好的文檔:

http://infohost.nmt.edu/tcc/help/pubs/pylxml/web/index.html

(試行PDF版本)

它現在的標準Python發行的一部分。

+0

如果正則表達式在某些時候中斷了,而不是爲了指出實際的隨機訪問,那麼Hmm可能對創建索引很有用。 – hippietrail 2011-08-16 09:18:03