XQuery导致内存不足错误
下面是XML文件-XQuery导致内存不足错误,xquery,basex,Xquery,Basex,下面是XML文件- <Info> <Name> <P1>Tomy</P1> <P2>John</P2> <R>P2</R> </Name> <Name> <P1>Tomy</P1> <P2>John</P2> <R>P1</R> </Na
<Info>
<Name>
<P1>Tomy</P1>
<P2>John</P2>
<R>P2</R>
</Name>
<Name>
<P1>Tomy</P1>
<P2>John</P2>
<R>P1</R>
</Name>
<Name>
<P1>Rojer</P1>
<P2>Messi</P2>
<R>P2</R>
</Name>
<Name>
<P1>Messi</P1>
<P2>Carl</P2>
<R>P2</R>
</Name>
<Name>
<P1>Messi</P1>
<P2/>
<R>P1</R>
</Name>
</Info>
以下是给出所需输出的解决方案-
let $o := doc('sam')//Name
for $x in $o
let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2/text()) else $x/P1/text()
for $y in $p
group by $y
order by $y
return <a>{$y}</a>
let$o:=doc('sam')//Name
在$o中的$x
设$p:=if(字符串长度($x/P2/text())>0),然后concat($x/P1/text(),'Vs.,$x/P2/text())else$x/P1/text()
在$p中为$y
按$y分组
以$y订购
返回{$y}
但此查询仅适用于某些选定的记录。实际上,我有200000多条记录,当我执行这个查询时,我得到了内存不足错误。我使用的是BaseX 7.6
如果我删除GROUPBY
子句,则执行时不会出错,但会给出错误的结果ie;具有重复的值。我需要清楚的结果
有什么帮助吗?试试这个
for $x in doc('sam')//Name
let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2 /text()) else $x/P1/text()
group by $p
order by $p
return <a>{$p}</a>
用于文档中的$x('sam')//Name
设$p:=if(字符串长度($x/P2/text())>0),然后concat($x/P1/text(),'Vs.,$x/P2/text())else$x/P1/text()
按$p分组
按$p订购
返回{$p}
对于任何关注此问题的人来说,内存不足行为的可能解决方案也可以是包装xml标记和复制与xQuery实现相关的新节点的特定行为,例如:
... <a>{$y}</a>
非常感谢。你能解释一下我为什么会有OOM吗?@John你的记忆中有很多条目。您还可以通过从-Xmx=1024mb(或任何合适的值)选项开始来增加BaseX的内存。@dirkk是的,这是肯定可以做到的,但我认为我使用2let
和2'表示`,使情况变得复杂。答案中的问题很有效。
... <a>{$y}</a>
let $o := doc('sam')//Name
for $x in $o
let $p := if (string-length($x/P2/text()) > 0) then concat($x/P1/text(),' Vs. ',$x/P2/text()) else $x/P1/text()
for $y in $p
group by $y
order by $y
return (# db:copynode false #) { <a>{$y}</a> }