2014-05-02 37 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