【发布时间】:2014-02-05 11:43:49
【问题描述】:
我有一个非常大的 XML 文件 (300mb),格式如下:
<data>
<point>
<id><![CDATA[1371308]]></id>
<time><![CDATA[15:36]]></time>
</point>
<point>
<id><![CDATA[1371308]]></id>
<time><![CDATA[15:36]]></time>
</point>
<point>
<id><![CDATA[1371308]]></id>
<time><![CDATA[15:36]]></time>
</point>
</data>
现在我需要阅读它并遍历 point 节点,为每个节点做一些事情。目前我正在像这样使用 Nokogiri:
require 'nokogiri'
xmlfeed = Nokogiri::XML(open("large_file.xml"))
xmlfeed.xpath("./data/point").each do |item|
save_id(item.xpath("./id").text)
end
但这不是很有效,因为它会解析所有内容,因此会产生巨大的内存占用(几 GB)。
有没有办法分块做呢?如果我没记错的话可能会被称为流媒体?
编辑
使用 nokogiris sax 解析器的建议答案可能没问题,但是当每个 point 中有多个节点我需要从中提取内容并以不同方式处理时,它会变得非常混乱。我宁愿一次访问一个point,处理它,然后继续下一个“忘记”前一个,而不是返回大量条目以供以后处理。
【问题讨论】:
-
+1 以良好的方式呈现它..
-
amolnpujari.wordpress.com/2012/03/31/reading_huge_xml-rb 我还发现 ox 在读取大型 xml 时比 nokogiri 快 5 倍另外我编写了一个包装器,它只允许您使用 ox 搜索大型 xml,允许您使用指定的迭代元素。 gist.github.com/amolpujari/5966431
标签: ruby xml-parsing