合并Nokogiri::XML::NodeSets后的XPath性能



我从web服务获得数据,每页100 <row>。我的脚本将这些页面连接到Nokogiri::XML::节点集。通过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包含来自五个文档的节点。这似乎是一个问题:

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

有人有一个更好的方法来合并节点集或合并文档的解决方案吗?

我希望只保留一个节点集的行为,因为这些数据实际上是一个大节点集,由于技术原因被web服务分割。

合并节点集的关键是使用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

相关内容

  • 没有找到相关文章

最新更新