gpt4 book ai didi

xml - 如何优化 XQuery fn :count() in FLWOR (Parallelize)?

转载 作者:搜寻专家 更新时间:2023-10-30 22:23:51 26 4
gpt4 key购买 nike

我正在使用 BaseX XML 数据库并且有很多 XML 数据,大约 50 000 个不同大小的文件。但是,我实现的一个本地功能是计算量大。不幸的是,它在我的工作中非常重要。

让我们假设每个学生有 50 000 个文件,每个学生都有一个名为 friend 的属性。我想了解每个学生,该学生有多少个 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 它使用了属性索引(已启用)。在大学学习了并行类(class)后,我的第一个想法是将 count 和 flwor 语句并行化为 block ,类似于 OpenMP。但经过一些研究,它似乎不支持并行查询。

有人知道如何解决这个问题吗?

谢谢!

编辑:XML 结构示例

<Student Name="Kevin" friend="Alvin" BirthDate="1985-06-29" etc..>
<More meta data> ....... />
</Student>

最佳答案

似乎可以将该问题视为分组问题,其中必须对组的成员进行计数,以便您可以尝试是否

let 
$friendsMap as map(xs:string, xs:integer) :=
map:merge(
for $student in $context
group by $friend := $student/@Friend/string()
return map { $friend : count($student) }
)
for $s in $context return <Student Name = '{$s/@Name}' NumberOfFriends = '{$friendsMap($s/@Name)}' />

性能更好,因为通常使用键来支持分组以使其更高效。

不知道它是否有助于解决 BaseX 和那个特定问题,但作为答案而不是评论发布,以提供一些可读的方式来建议代码。

您发布的代码片段中唯一的其他问题似乎是该示例具有拼写为 Friend 的属性,而 XPath 搜索 @friend,不确定是否是问题中的错字或者索引不起作用的原因。

关于xml - 如何优化 XQuery fn :count() in FLWOR (Parallelize)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56078503/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com