2010-09-14 91 views

回答

5

大多數DOM庫(如ElementTree)都在覈心中構建了整個文檔模型。傳統上,當您的模型太大而無法一次裝入內存時,您需要使用更多面向流的解析器,如xml.sax

這通常比您期望的要難,特別是在用於像一次處理整個DOM的高階操作時。

有沒有可能是你的XML文檔而不是簡單的像

<entries> 
    <entry>...</entry> 
    <entry>...</entry> 
</entries> 

這將讓你更ElementTree的友好的方式對數據子集的工作?

+0

非常感謝。 – zhangwf 2010-09-15 07:45:50

2

我見過,可以處理這種在所有的事物的API是pulldom:

http://docs.python.org/library/xml.dom.pulldom.html

Pulldom使用SAX API構建部分DOM節點;通過將特定的子樹作爲一個組提取,然後在完成時丟棄它們,您可以通過使用DOM的完整性來獲得SAX的內存效率。

這是一個不完整的API;當我使用它時,我不得不修改它以使其完全可用,但它作爲基礎。我不再使用它了,所以我不記得我必須添加什麼;只是提前警告。

這很慢。

XML是處理大型數據集的非常差的格式。如果您對源數據有任何控制權,並且對數據集合有意義,那麼將數據拆分爲可以完全分析到內存中的較小塊,會更好。

另一種選擇是使用SAX API,但他們非常痛苦地直接做任何不平凡的事情。

11

檢查出iterparse()函數。關於如何使用它來分析非常大的文檔的描述可以在here找到。

+0

iterparse()函數將解決您的問題,我最近通過iterparse幫助我最近解析了一個1GB xml文檔。 – 2012-10-03 01:40:37