2011-03-16 144 views
2

我们一直在使用libxml-ruby几年。对于30 MB或更少的文件来说太棒了,但它被seg故障所困扰。项目中没有人真的似乎在解决它们,只是为了将这些归咎于第三方软件。这是他们的特权,当然是免费的。如何使用libxml-ruby在Ruby中读取大型XML文件?

但我仍然无法阅读这些大文件。我想我可以写一些悲惨的黑客把它们分成更小的文件,但我想避免这种情况。有没有人有任何阅读Ruby中非常大的XML文件的经验?

+0

https://github.com/amolpujari/reading-huge-xml – 2012-07-14 06:58:10

回答

3

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

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

6

当加载大文件时,无论它们是否为xml,您都应该开始考虑一次一个文件(本例中称为流文件),而不是将整个文件加载到内存中。

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

+0

+1。非常好的链接。 – steenslag 2011-03-16 01:21:45

+0

我认为JRuby的,VTD-XML的功能更强大,使用更方便比拉 – 2011-03-16 07:48:54

3

的libxml-红宝石确实有很多错误,而不仅仅是崩溃错误,但不兼容的版本,内存泄漏等......

我强烈建议Nokogiri。作为快速XML解析的新热点,Ruby社区已经聚集在Nokogiri周围。它有一个reader pull parser,SAX parser和您的标准in-memory DOM-ish parser

对于真正大的XML文件,我推荐使用Reader,因为它与SAX一样快,但编程起来更容易,因为您不必手动跟踪这么多状态。

+0

这是什么读者你说话约翰? – AKWF 2011-03-16 06:33:46

+0

对不起,我的意思是Nokogiri :: XML :: Reader,Nokogiri的pull语法分析器http://nokogiri.org/Nokogiri/XML/Reader.html – 2011-03-16 06:39:15

+0

我在小文件上使用Nokogiri,但这些文件对于Nokogiri来说太大。 – AKWF 2011-03-16 13:36:31

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,一切都变成了玫瑰。

UPDATE:

我无法毕竟解决我的问题。没有使用reader.expand,似乎没有办法到达子树。

所以我想没有办法读取和解析一个大的XML文件与libxml红宝石?自2009年以来,reader.expand内存泄漏漏洞已经开放,甚至没有回应。失败失败失败。

+0

是的,不幸的是#exapand存在内存泄露:http://rubyforge.org/tracker/index.php?func=detail&aid=26297&group_id=494&atid=1971 – 2011-03-16 01:54:52

+1

根据跟踪器,2011年4月修复了这个问题 – 2013-01-24 00:13:27