在解析大型XML文件时获取“无法分配内存”

时间:2013-03-29 07:36:08

标签: ruby-on-rails ruby nokogiri

我在使用Nokogiri进行解析时遇到了“无法分配内存”的问题。为此,我写了以下代码。

require 'open-uri'
require 'nokogiri'
f = File.open("/my_pplications/XML/one.xml")
doc = Nokogiri::XML(f)    
stack = Hash.new
doc.children.each do |x|  
  x.children.each do |sx|
   sx.children.each do |v|      
     stack[v.name] = v.text      
   end 
  end 
end


如果one.xml文件的大小为smaller,我可以解析并获取所有内容。 但如果该文件为too large(more than 700MB),则会收到"[FATAL] failed to allocate memory"之类的错误。那么如何解析完整的大型XML文件呢。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

Nokogiri :: XML构建了整个文档的内存表示,因此占用的内存比文档的磁盘大小多得多。然后很容易迭代它并使用xpath或css查询。

另一种方法是使用nokogiri的SAX解析器。一个sax解析器几乎没有任何内存开销,因为它没有将整个文档存储在内存中:它只是遍历文档,告诉你提供的关于有趣事件的对象,比如标签foo已经启动,我发现了一些文本,foo标签有关闭等。

使用它而不是更高级别的接口通常需要做更多的工作,但是你可以通过这种方式吞噬大量的XML文件