我在使用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文件呢。
有人可以帮助我吗?
答案 0 :(得分:4)
Nokogiri :: XML构建了整个文档的内存表示,因此占用的内存比文档的磁盘大小多得多。然后很容易迭代它并使用xpath或css查询。
另一种方法是使用nokogiri的SAX解析器。一个sax解析器几乎没有任何内存开销,因为它没有将整个文档存储在内存中:它只是遍历文档,告诉你提供的关于有趣事件的对象,比如标签foo已经启动,我发现了一些文本,foo标签有关闭等。
使用它而不是更高级别的接口通常需要做更多的工作,但是你可以通过这种方式吞噬大量的XML文件