Я использую базу данных XML BaseX и у меня много XML-данных, примерно 50 000 файлов различного размера.Тем не менее, одна из моих локальных функций, которые я реализовал, - тяжелая вычислительная.К сожалению, это очень важно в моей работе.
Допустим, у меня есть 50 000 файлов на каждого ученика, и у каждого ученика есть атрибут с именем friend
.Я хочу узнать для каждого ученика, сколько друзей у ученика.
Вот пример кода:
declare variable $context := /Students
declare function local:CalculateFriends($student)
{
let $studentName := $student/@Name
return fn:count($context[@friend = $studentName])
}
for $s in $context
let $numberOfFriends := local:CalculateFriends($s)
return <Student Name = '{$s/@Name}' NumberOfFriends = '{$numberOfFriends}' />
Этот код отлично работает для одного один студент.На 1000 студентов это занимает примерно 5 минут.Представьте себе для 50 000 студентов.Он либо дает сбой, либо получает тайм-аут, я не могу его отладить.Оставил это на ночь и вернулся, ничего не произошло.
Есть ли способ оптимизировать это?Поскольку при использовании @friend = $studentName
используется индекс атрибута (он включен).Пройдя параллельный курс в университете, моей первой мыслью было распараллелить операторы count и flwor на куски, похожие на OpenMP.Но после некоторого исследования кажется, что он не поддерживает параллельные запросы.
Кто-нибудь знает, как решить эту проблему?
Спасибо!
РЕДАКТИРОВАТЬ: Пример структуры XML
<Student Name="Kevin" friend="Alvin" BirthDate="1985-06-29" etc..>
<More meta data> ....... />
</Student>