【发布时间】:2019-09-28 09:59:33
【问题描述】:
我正在使用 BaseX XML 数据库并且有很多 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>
【问题讨论】:
-
您的代码示例包含多个语法错误(缺少分号),并且从代码中看不清楚文档结构。
/Students是根节点还是所有学生的序列?每个学生可以只有一个外向的友谊(因为他们似乎是学生的属性)?至少有一个 XML 文件的摘录会很有帮助。 -
@LeoWörteler 嗨,很抱歉回复晚了。
/Students是所有学生的序列,也是数据库的根上下文。你也是正确的,每个学生只有一个外向的友谊,这是在属性中指定的。在我的编辑中添加了一个 XML 文件的简短示例。
标签: xml database xquery basex xml-database