Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
XQuery导致内存不足错误_Xquery_Basex - Fatal编程技术网

XQuery导致内存不足错误

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

下面是XML文件-

<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是的,这是肯定可以做到的,但我认为我使用2
let
和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> }