gpt4 book ai didi

ruby - 在 ruby​​ 中创建大文件 xml

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:35 24 4
gpt4 key购买 nike

我想将大约 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 秒,内存消耗稳定在 10 MB。

那么有没有更好的解决方案来用 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

最佳答案

解决方案一

如果您主要关心速度,我会使用 libxml-ruby直接:

$ time ruby test.rb 

real 0m7.352s
user 0m5.867s
sys 0m0.921s

API 非常简单:

require 'rubygems'
require 'xml'
doc = XML::Document.new()
doc.root = XML::Node.new('root_node')
root = doc.root

500000.times do |k|
root << elem1 = XML::Node.new('products')
elem1 << elem2 = XML::Node.new('widget')
elem2['id'] = k.to_s
elem2['name'] = 'Awesome widget'
end

doc.save('foo.xml', :indent => false, :encoding => XML::Encoding::UTF_8)

在这种情况下使用 :indent => true 没有太大区别,但对于更复杂的 XML 文件可能会有所不同。

$ time ruby test.rb #(with indent)

real 0m7.395s
user 0m6.050s
sys 0m0.847s

方案二

当然,最快的解决方案是手动编写 XML,而且不会占用内存,但这很容易产生其他错误来源,例如可能无效的 XML:

$ time ruby test.rb 

real 0m1.131s
user 0m0.873s
sys 0m0.126s

代码如下:

f = File.open("foo.xml", "w")
f.puts('<doc>')
500000.times do |k|
f.puts "<product><widget id=\"#{k}\" name=\"Awesome widget\" /></product>"
end
f.puts('</doc>')
f.close

关于ruby - 在 ruby​​ 中创建大文件 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7466822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com