我想将大约50MB的数据写入XML文件。
我发现Nokogiri(1.5.0)在仅读取而不写入时解析效率高,但是Nokogiri不适合写入XML文件,因为它会将完整的XML数据保存在内存中,直到最终写入。
我发现Builder(3.0.0)是一个不错的选择,但我不确定它是否是最佳选择。
我用以下简单的代码尝试了一些基准测试:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
Nokogiri大约需要143秒,内存消耗逐渐增加并最终达到约700 MB。Builder花费了约123秒,内存消耗足够稳定,大约为10MB。
那么,在Ruby中有更好的解决方案来编写大型XML文件(50 MB)吗?
这是使用Nokogiri的代码:
require 'rubygems'
require 'nokogiri'
a = Time.now
builder = Nokogiri::XML::Builder.new do |xml|
xml.root {
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
}
end
o = File.new("test_noko.xml", "w")
o.write(builder.to_xml)
o.close
puts (Time.now-a).to_s
以下是使用Builder的代码:
require 'rubygems'
require 'builder'
a = Time.now
File.open("test.xml", 'w') {|f|
xml = Builder::XmlMarkup.new(:target => f, :indent => 1)
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
}
puts (Time.now-a).to_s