XQuery 最大分段错误
XQuery max segmentation fault
我正在尝试将 XQuery/XPath 与 the XML version of the mondial database to find the two cities that are furthest apart from each other, only taking into account those with a population higher than 500,000. For calculating the distances, I'm assuming a Mercator projection 一起使用。
这是我的代码:
let $db := doc("mondial.xml")
(: Cities with 500,000+ population :)
let $cities := (for $city in $db/mondial/country//city
(: Compare using latest population data :)
where $city/population[@year = max($city/population/@year)] > 500000
return $city)
(: City pairs and the distances between them (not
not square-rooted as all we care about is order) :)
let $distancesSquared := (for $city1 in $cities
for $city2 in $cities
where $city1 != $city2
return <distancesquared city1="{ data($city1/name) }" city2="{ data($city2/name) }">{ (
let $diffLong := number($city1/longitude) - number($city2/longitude)
let $diffLat := number($city1/latitude) - number($city2/latitude)
return $diffLong * $diffLong + $diffLat * $diffLat
) }</distancesquared>)
let $max := max($distancesSquared)
return $distancesSquared[data(.) = $max]
但出于某种原因,我在这一行遇到了分段错误:
let $max := max($distancesSquared)
我正在使用 xqilla
来 运行 这样的查询:
xqilla -o query.xml query.xq
知道我的代码有什么问题吗?
这是一个非常糟糕的查询,因为中间数据量随输入数据量呈二次方变化。
因为变量$distancesSquared被引用了两次,几乎肯定会在内存中物化,而且很可能很大。
首先检查小数据量是否仍然出现该故障。如果即使是小数据集也会发生这种情况,那么您的代码没有问题,这是 XQuilla 中的错误。
如果它只发生在大型数据集上,那么您可能超出了某种系统限制(可能是内存);检查是否有任何可以调整的配置参数。
更好:找到改进的算法。
第一步,尝试一种在时间上仍然是二次但在内存中不再是二次的算法:具体来说,对于每个城市,找到最远的城市;以
形式建立列表
<city name="London" furthest="Christchurch" distance="8000"/>
等;然后在这个城市对列表中找到最大值。
更聪明的是,有一些方法可以在不检查所有城市对的情况下解决这个问题。恐怕我研究这些算法已经有一段时间了,所以我不记得细节了。但总体思路是将每个城市分配到一个区域,计算出每对区域中点与点之间的极限距离,然后在查找距离给定城市最远的城市时,只处理距离足够远的区域。
我正在尝试将 XQuery/XPath 与 the XML version of the mondial database to find the two cities that are furthest apart from each other, only taking into account those with a population higher than 500,000. For calculating the distances, I'm assuming a Mercator projection 一起使用。
这是我的代码:
let $db := doc("mondial.xml")
(: Cities with 500,000+ population :)
let $cities := (for $city in $db/mondial/country//city
(: Compare using latest population data :)
where $city/population[@year = max($city/population/@year)] > 500000
return $city)
(: City pairs and the distances between them (not
not square-rooted as all we care about is order) :)
let $distancesSquared := (for $city1 in $cities
for $city2 in $cities
where $city1 != $city2
return <distancesquared city1="{ data($city1/name) }" city2="{ data($city2/name) }">{ (
let $diffLong := number($city1/longitude) - number($city2/longitude)
let $diffLat := number($city1/latitude) - number($city2/latitude)
return $diffLong * $diffLong + $diffLat * $diffLat
) }</distancesquared>)
let $max := max($distancesSquared)
return $distancesSquared[data(.) = $max]
但出于某种原因,我在这一行遇到了分段错误:
let $max := max($distancesSquared)
我正在使用 xqilla
来 运行 这样的查询:
xqilla -o query.xml query.xq
知道我的代码有什么问题吗?
这是一个非常糟糕的查询,因为中间数据量随输入数据量呈二次方变化。
因为变量$distancesSquared被引用了两次,几乎肯定会在内存中物化,而且很可能很大。
首先检查小数据量是否仍然出现该故障。如果即使是小数据集也会发生这种情况,那么您的代码没有问题,这是 XQuilla 中的错误。
如果它只发生在大型数据集上,那么您可能超出了某种系统限制(可能是内存);检查是否有任何可以调整的配置参数。
更好:找到改进的算法。
第一步,尝试一种在时间上仍然是二次但在内存中不再是二次的算法:具体来说,对于每个城市,找到最远的城市;以
形式建立列表<city name="London" furthest="Christchurch" distance="8000"/>
等;然后在这个城市对列表中找到最大值。
更聪明的是,有一些方法可以在不检查所有城市对的情况下解决这个问题。恐怕我研究这些算法已经有一段时间了,所以我不记得细节了。但总体思路是将每个城市分配到一个区域,计算出每对区域中点与点之间的极限距离,然后在查找距离给定城市最远的城市时,只处理距离足够远的区域。