如何使用libxml-ruby在Ruby中读取大型XML文件?

时间:2011-03-16 00:47:02

标签: ruby xml

我们使用libxml-ruby已经有好几年了。对于30 MB或更小的文件来说非常棒,但它被seg故障所困扰。项目中没有人真正关心修复它们,只是将这些归咎于第三方软件。这当然是他们的特权,它是免费的。

但我还是无法阅读这些大文件。我想我可以写一些可怜的黑客将它们分成更小的文件,但我想避免这种情况。有没有其他人有在Ruby中阅读非常大的XML文件的经验?

4 个答案:

答案 0 :(得分:6)

当加载大文件时,无论它们是否为xml,你应该开始考虑一次拍摄片段(在这种情况下称为流媒体),而不是将整个文件加载到内存中。

我强烈建议您阅读this article about pull parsers。使用此技术将允许您更轻松地读取此文件,而不是一次将所有文件加载到内存中。

答案 1 :(得分:4)

感谢大家的出色表现。通过查看 Processing large XML file with libxml-ruby chunk by chunk,我能够解决我的问题。

答案是避免使用:

reader.expand

而是使用:

reader.read

或:

reader.next

与:

结合使用
reader.node

只要您不是按原样存储节点,它就会很好用。你想立即在那个节点上操作,因为reader.next会把它吹掉。

为了回应之前的回答,我可以理解libxml-ruby是一个流解析器。 seg故障的问题出现在垃圾收集问题中,这些问题导致内存泄漏。一旦我学会了不使用reader.expand,一切都出现了玫瑰。

更新:

毕竟我无法解决我的问题。似乎没有办法在不使用reader.expand的情况下进入子树。

所以我猜有没有办法读取并使用libxml-ruby解析大型XML文件?自2009年以来,reader.expand内存泄漏错误一直没有响应?失败失败。

答案 2 :(得分:3)

我建议您查看SAX XML parser。它们旨在处理大文件。我有一段时间不需要,但它们很容易使用;当它读取XML文件时,它将传递您的代码各种事件,您可以使用代码捕获和处理这些事件。

Nokogiri siteSAX Machine的链接,该链接基于Nokogiri,因此这是另一种选择。无论哪种方式,Nokogiri都得到了很好的支持,并被很多人使用,包括我在内的所有HTML和XML解析。它支持DOM和SAX解析,允许使用CSS和XPath访问器,并使用libxml2进行解析,因此它很快并且基于标准的解析库。

答案 3 :(得分:3)

libxml-ruby确实有很多错误,不仅仅是崩溃,还有版本不兼容,内存泄漏等......

我强烈推荐Nokogiri。 Ruby社区已经将Nokogiri作为快速XML解析的新热点。它有reader pull parserSAX parser和您的标准in-memory DOM-ish parser

对于非常大的XML文件,我建议使用Reader,因为它与SAX一样快,但更容易编程,因为您不必手动跟踪这么多状态。