【问题标题】:How to optimize XQuery fn:count() in FLWOR (Parallelize)?如何在 FLWOR(并行化)中优化 XQuery fn:count()?
【发布时间】: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


【解决方案1】:

似乎可以将该问题视为分组问题,其中必须计算组的成员,因此您可以尝试是否

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 和特定问题有帮助,但将其作为答案而不是评论发布,以便有一些可读的方式来建议代码。

您发布的代码 sn-ps 中唯一的其他问题似乎是样本具有拼写为 Friend 的属性,而 XPath 搜索 @friend,不确定这是问题中的拼写错误还是原因为什么索引不起作用。

【讨论】:

  • 太棒了,我想知道我怎么没想到在我的算法中使用地图。我假设在 XQuery 中使用 map 具有 O(1) 查找时间的性能,这就是它如此高效的原因。也许使用这种方法可以提高我在其他算法中的表现。谢谢!标记为答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
  • 2023-03-18
相关资源
最近更新 更多