2014-05-02 61 views
0

最近我想處理維基百科數據。在那種情況下,我下載了它的en-lang XML轉儲。 它已經超過44GB。我認爲我會用XmlSlurper解析它,根據文檔,它足以解析大型XML文件。不幸的是我得到了一些「內存不足的例外」。有什麼方法(使用現有的庫)在Groovy解析該「怪物文件」?解析Groovy中的維基百科xml轉儲

回答

0

XmlSlurper確實在封面下使用了SAX解析器,但它將數據加載到內部模型中,因此不適合解析真正的大文件。

我相信你會需要使用native SAX parser,還是其他什麼東西取決於你(XSLT?)用例

0

你需要找到一個工具,可以以流方式處理XML,而比在存儲器中將整個事物加載到樹模型中更加容易。您可以使用SAX(您將代碼編寫爲事件處理程序方法,然後解析器在通過文檔時調用它)或StAX(從解析器「拉」事件而不是讓解析器將它們「推」到你),但另一種選擇是使用像XOM一個模型,可以在一種「半流」模式運行,讓您的樹模型只是一個<page>轉儲在一個時間:

import nu.xom.* 

class PageHandler extends NodeFactory { 
    private Nodes EMPTY = new Nodes() 

    Closure handler 

    public Nodes finishMakingElement(Element e) { 
    if(e.localName == 'page') { 
     handler.call(e) 
     return EMPTY 
    } else { 
     return super.finishMakingElement(e) 
    } 
    } 
} 

// call it as 
new Builder(new PageHandler(handler:{ page -> 
    def latestRevText = 
     page.getFirstChildElement('revision').getFirstChildElement('text').value 
    // ... 
})).build(fileOrInputStreamOrReader) 

您可以對其他一些庫進行類似的處理,例如Dom4J