巨大なXMLファイルを構築する必要があります。約1〜50MBです。私はビルダーを使うことが十分に効果的だと思っていましたが、それは多少です。問題は、プログラムが最後の行に到達した後すぐに終了するのではなく、Rubyはまだ数秒間何かをやっていますか?おそらくガベージコレクションですか?その後、プログラムは最終的に終了します。巨大なXMLのNokogiriビルダーのパフォーマンス?
実際の例を挙げると、私はXMLファイルを構築する時間を測定しています。 XMLがビルドされたときに55秒(長い時間がかかるのでデータベースがある)が出力されますが、Rubyはまだ15秒以上処理されており、プロセッサは狂っています。次のように
擬似/実際のコードは次のとおりです。私はクラスの私自身の構造を使用して別のアプローチを使用していた、とビルドの速度は同じだったが、最後の行で
...
builder = Nokogiri::XML::Builder.with(doc) do |xml|
build_node(xml)
end
...
def build_node(xml)
...
xml["#{namespace}"] if namespace
xml.send("#{elem_name}", attrs_hash) do |elem_xml|
...
if has_children
if type
case type
when XML::TextContent::PLAIN
elem_xml.text text_content
when XML::TextContent::COMMENT
elem_xml.comment text_content
when XML::TextContent::CDATA
elem_xml.cdata text_content
end
else
build_node(elem_xml)
end
end
end
end
注意プログラムは通常終了しましたが、現在はNokogiriを使用する必要がありますので、解決策を見つける必要があります。
XMLの作成後、X秒間のオーバーヘッドが発生するのを避けるためにできることはありますか?それも可能ですか?
UPDATE:私の最小限の実施例の作成中にAdiel Mittmannからの提案へ
おかげで、私は問題を見つけることができました。私は今問題を実証している小さな(うまくはない)例を持っています。
次のコードは、問題を引き起こしている:
xml.send("#{elem_name}_") do |elem_xml|
...
elem_xml.text text_content #This line is the problem
...
end
だからラインは鋸山のマニュアルに基づいて、次のコードを実行:
def create_text_node string, &block
Nokogiri::XML::Text.new string.to_s, self, &block
end
Text node creation codeは、その後、実行されます。では、ここで何が起こっているのですか?
UPDATE 2:他のいくつかの試行後
、問題を簡単に再生することができる。
builder = Nokogiri::XML::Builder.new do |xml|
0.upto(81900) do
xml.text "test"
end
end
puts "End"
だから、本当に鋸山そのものですか?私のためのオプションはありますか?
ちょうど参考:多くのSOユーザーは、一般的なユーザー名を持つ新しいアカウントによって投稿された質問には注意が必要です。それに関連して高い放棄率があります。 –
情報をありがとう、正直言って、私は気付かなかった、私は生成されたユーザー名を使用していた=>今変更されました。私はこのウェブサイトを初めて利用していますが、私がそのウェブサイトの積極的な役割を果たすことができることを願っています。 – Giron
1つのXMLファイルを読み込んで別のXMLファイルに変換していますか? –