0

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 つのノードセットのみの動作を維持したいと考えています。

4

1 に答える 1

0

ノードセットをマージするための鍵は、Node#remove でノードをデタッチし、それらを他のノードセットに追加することです。

nodeset = nil
rows.each do |slice|
  if nodeset.nil?
    nodeset = slice
  else
    slice.children.each do |row|
      nodeset.add_child(row.remove)
    end
  end
end
于 2013-03-27T13:57:15.050 に答える