使用XmlSlurper解析(非常)大的XML文件

使用XmlSlurper解析(非常)大的XML文件,xml,groovy,xmlslurper,Xml,Groovy,Xmlslurper,我是Groovy的新手,我正在尝试使用XmlSlurper读取一个(相当)大的XML文件(超过1Gb),由于它不能在内存中构建整个DOM,因此它应该对大文件产生奇迹般的效果 尽管如此,我还是不断得到“OutOfMemoryError:Java堆空间”,这让我觉得显然有什么地方我做错了。我尝试增加Xmx设置,但我更愿意解决这个问题,因为我以后可能不得不处理更大的文件 以下是我使用的代码行: def posts = new XmlSlurper().parse(new File("posts.xml

我是Groovy的新手,我正在尝试使用XmlSlurper读取一个(相当)大的XML文件(超过1Gb),由于它不能在内存中构建整个DOM,因此它应该对大文件产生奇迹般的效果

尽管如此,我还是不断得到“OutOfMemoryError:Java堆空间”,这让我觉得显然有什么地方我做错了。我尝试增加Xmx设置,但我更愿意解决这个问题,因为我以后可能不得不处理更大的文件

以下是我使用的代码行:

def posts = new XmlSlurper().parse(new File("posts.xml"))
有什么不对劲的暗示吗

提前感谢,


Jérémie.

Groovy的
XmlSlurper
是一个SAX解析器,但会将整个模型加载到内存中


为了避免OOM异常,您可能需要增加内存余量(如您所说,使用
-Xmx
设置),或者您可以从文档中获取所需的数据

我参加这次聚会有点晚,但我也遇到了同样的问题

我向groovy用户邮件列表提出了一个建议,实际上建议将类似于XML::Twig perl模块的东西添加到XmlSlurper中

def xpathSlurper = new XPathXmlSlurper2();    
def c = { twig, it ->      
    println it.text().trim();
    twig.purgeCurrent();
}
xpathSlurper.setTwigRootHandler(xpath, c);
def fdata = xpathSlurper.parse(new File("test.xml")); 
我在这里附上了示例代码:


我希望这有帮助

这就解释了。谢谢现在,我按照tim_yates的建议,通过编写自己的SAX解析器解决了我的问题,但由于我将来一定要处理类似(可能更大)数量的数据,所以我很高兴有这样的东西。谢谢你指出!这个问题类似: