XMLファイルにいくつかのデータを書きたいと思っています(XMLファイルは約50MBになります)。ルビーの大きなファイルxmlを作成する
ノコギリ(1.5.0)の宝石はであり、解析するには最も効率が良い(ちょうど読み書きされない)ことがわかった。 NokogiriはXMLファイルに書き込むための良い選択肢ではありません。なぜなら、書き込みが完了するまで完全なXMLデータをメモリに保持しているからです。
私はビルダー(3.0.0)が良いオプションであることがわかりましたが、その最良のオプションであるかどうかはわかりません。
私は、次の簡単なコードで、いくつかのベンチマークを試してみました:
(1..500000).each do |k|
xml.products {
xml.widget {
xml.id_ k
xml.name "Awesome widget"
}
}
end
鋸山を約143秒かかり、また、メモリの消費量が徐々に増加し、約700メガバイトでようやく終わりました。
ビルダーの所要時間は約123秒で、メモリ消費量は10 MBで十分でした。
Rubyに巨大なXMLファイル(50 MB)を書き込むためのよりよい解決策がありますか?
鋸山ファイル:
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
ビルダーファイル:
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
再解析:鋸山はかなりユーザーフレンドリーですが、スピードが鍵となるとき、私は(同様nogokiriで利用可能)SAXパーサを書くために行きます。私は便利なユーティリティクラスを用意しています。これは、xmlから必要なものの配列をすばやく構築するために使用します(xmlはかなりシンプルです)。もしそうでなければ、https://gist.github.com/854726カスタムsaxparserを作成します。 – sunkencity
あなたはそれを他の方法で取った。配列(アクティブレコード)からxmlを構築したい。 –
「私はnokogiri(1.5.0)の宝石を解析するのが最も効率的だ」とコメントしました。私の主張は、saxparser apiを直接使うことです。 – sunkencity