2

在使用 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 文件。

有人可以帮我吗?

4

1 回答 1

4

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

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

一般来说,使用它而不是使用更高级别的接口需要做更多的工作,但是您可以通过这种方式吞噬巨大的 XML 文件

于 2013-03-29T09:03:15.777 回答