Я получаю данные от веб-службы, 100 <row>
на страницу. Мой скрипт соединяет эти страницы с Nokogiri::XML::Nodeset. Поиск набора узлов через XPath выполняется очень медленно.
Этот код заменяет вызов веб-службы и синтаксический анализ 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]
Проблема. Следующий код выполняется примерно за десять секунд. С неслитным набором узлов это делается в мгновение ока:
(1..500).to_a.sample(100).each do |sample|
rows.at('//row[./NUMBER="%d"]' % sample)
end
Есть ли у кого-нибудь решение, как лучше объединить наборы узлов или объединить документы?
Я хотел бы сохранить поведение только одного набора узлов, так как эти данные представляют собой практически один большой набор узлов, который был разделен веб-сервисом по техническим причинам.