Я столкнулся с интересной проблемой, когда мне нужно просмотреть несколько больших файлов XML (каждый из которых составляет сотни МБ) и вывести определенные данные из каждого из элементов, и сделать это как можно быстрее. Примеры:
Очки.xml:
<points>
<point>
<identifier>bb25c66c-27d0-447f-aaad-bd8290b332fd</identifier>
<name>A</name>
</point>
<point>
<identifier>f187cc74-2709-4464-995c-b3bdcae46b39</identifier>
<name>B</name>
</point>
</points>
Маршруты.xml:
<routes>
<route>
<pointLink xlink:href="urn:uuid:bb25c66c-27d0-447f-aaad-bd8290b332fd"/>
<name>1</name>
</route>
<route>
<pointLink xlink:href="urn:uuid:f187cc74-2709-4464-995c-b3bdcae46b39"/>
<name>2</name>
</route>
</routes>
В разных документах есть десятки тысяч элементов точек/маршрутов, и они намного сложнее этого, но для этого примера этого отрывка будет достаточно.
Вывод должен быть примерно таким:
1 - A
2 - B
Я не могу модифицировать сами документы, с этим мне приходится работать, и теперь вопрос — как максимально эффективно связать элементы на основе идентификатора? Я говорю о том, как это сделать, возможно, о другом способе думать об этом, а не о самом коде, поскольку в конце концов он все равно будет совершенно другим.
Я попытался перебрать маршруты, а затем найти точки с помощью FLWOR:
for $route in doc('routes.xml')/routes/route
return concat(
$route/name/text(),
' - ',
doc('points.xml')/points/point[./identifier/text() = substring-after($route/pointLink/@xlink:href, 'urn:uuid:')]/name/text()
)
Это не сработало очень хорошо (заняло почти час). Аналогичная история и с этим подходом:
for $route in doc('routes.xml')/routes/route,
$point in doc('points.xml')/points/point[./identifier/text() = substring-after($route/pointLink/@xlink:href, 'urn:uuid:')]
return concat(
$route/name/text(),
' - ',
$point/name/text()
)
В конце концов, мне нужно будет использовать больше подэлементов из точки/маршрута в выводе, поэтому я думаю, что мне нужно перебрать их с помощью for, а затем объединить вывод, но, возможно, я ошибаюсь, поэтому я спрашиваю здесь.
Я что-то упускаю из виду, или просто нет более быстрого способа сделать это?
point/identifier
должна работать быстрее. - person Martin Honnen   schedule 19.06.2019