Web サービスから 1 ページあたり 100 のデータを取得してい<row>
ます。私のスクリプトは、これらのページを Nokogiri::XML::Nodeset に結合します。XPath によるノードセットの検索は非常に低速です。
このコードは、Web サービス呼び出しと XML 解析を置き換えますが、症状は同じです。
rows = []
(1..500).to_a.each_slice(100) { |slice|
rows << Nokogiri::XML::Builder.new { |xml|
xml.root {
xml.rows {
slice.each { |num|
xml.row {
xml.NUMBER {
xml.text num
}
}
}
}
}
}.doc.at('/root/rows')
}
rows = rows.map { |a| a.children }.inject(:+)
結果の NodeSet には、5 つのドキュメントからのノードが含まれます。これは問題のようです:
rows.map { |r| r.document.object_id }.uniq
=> [21430080, 21732480, 21901100, 38743080, 40472240]
問題: 次のコードは約 10 秒で実行されます。マージされていないノードセットでは、これは瞬く間に行われます。
(1..500).to_a.sample(100).each do |sample|
rows.at('//row[./NUMBER="%d"]' % sample)
end
ノードセットをより良い方法でマージしたり、ドキュメントをマージしたりするソリューションを誰かが持っていますか?
このデータは実質的に 1 つの大きなノードセットであり、技術的な理由で Web サービスによって分割されたため、1 つのノードセットのみの動作を維持したいと考えています。