我们使用libxml-ruby已经有好几年了。对于30 MB或更小的文件来说非常棒,但它被seg故障所困扰。项目中没有人真正关心修复它们,只是将这些归咎于第三方软件。这当然是他们的特权,它是免费的。
但我还是无法阅读这些大文件。我想我可以写一些可怜的黑客将它们分成更小的文件,但我想避免这种情况。有没有其他人有在Ruby中阅读非常大的XML文件的经验?
答案 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 site有SAX Machine的链接,该链接基于Nokogiri,因此这是另一种选择。无论哪种方式,Nokogiri都得到了很好的支持,并被很多人使用,包括我在内的所有HTML和XML解析。它支持DOM和SAX解析,允许使用CSS和XPath访问器,并使用libxml2进行解析,因此它很快并且基于标准的解析库。
答案 3 :(得分:3)
libxml-ruby确实有很多错误,不仅仅是崩溃,还有版本不兼容,内存泄漏等......
我强烈推荐Nokogiri。 Ruby社区已经将Nokogiri作为快速XML解析的新热点。它有reader pull parser,SAX parser和您的标准in-memory DOM-ish parser。
对于非常大的XML文件,我建议使用Reader,因为它与SAX一样快,但更容易编程,因为您不必手动跟踪这么多状态。