XQuery:过滤大量数据

XQuery:过滤大量数据,xquery,basex,xquery-3.0,Xquery,Basex,Xquery 3.0,我确实有一个包含150k入口的xml文件(大约3gb)。 样本条目: <entry> .... lots of data here .... <customer-id>1</customer-id> </entry> 我目前正在检查每个条目的客户id是否包含在黑名单中,如下所示: for $entry in //entry let $customer-id:= $entry//customer-id let $inblacklis

我确实有一个包含150k入口的xml文件(大约3gb)。 样本条目:

<entry>
.... lots of data here ....
<customer-id>1</customer-id>
</entry>
我目前正在检查每个条目的客户id是否包含在黑名单中,如下所示:

for $entry in //entry
    let $customer-id:= $entry//customer-id
    let $inblacklist := $blacklist = //$customer-id
return if (not($inblacklist)) then $entry else ()
如果未包括在内,则会将其退回

按照这种方法,经过大约2分钟的处理后,我确实出现了内存不足错误

我试图调整代码,以便我首先分组,只询问每个分组是否包含在黑名单中。但我仍然会在这种情况下出现内存不足的错误

for $entry in //entry
    let $customer-id:= $entry//customer-id
    group by $customer-id
    let $inblacklist := $blacklist = //$customer-id
return if (not($inblacklist)) then $entry else ()
处理过程在中进行。 内存不足错误的原因是什么?解决此问题的最佳方法是什么?
如果我采用第二种方法,分组数据是否会减少所需的迭代次数

似乎简单地执行
//entry[not(customer id=$blacklist)]
给出了一个非常简单的表达式。至于内存不足,文件是否在BaseX数据库中?您如何运行查询(命令行,GUI),在何处/如何保存或显示查询结果?我通过GUI运行程序。文件本身被加载到程序中,在那里我执行查询。我不会像保存程序那样保存结果,因为它会在异常情况下停止。只是一个一般性的注释,如果您在FLWOR中使用
WHERE
子句,而不是在返回中使用if/else,那么您的代码可以更容易编写和理解:
return if(not($inblacklist))然后$entry else()
可以写成
where not($inblacklist)return$entry
另外,您在选择条目时是否尝试将黑名单过滤器移动到谓词中
对于//entry[not(.//customer id=$blacklist)]
中的$entry,它可能会将一组条目限制为分组方式,从而减少内存需求我不确定BaseX GUI处理显示147k条目的任务的效果如何,是否所有
//entry
条目的选择都没有耗尽内存?
for $entry in //entry
    let $customer-id:= $entry//customer-id
    group by $customer-id
    let $inblacklist := $blacklist = //$customer-id
return if (not($inblacklist)) then $entry else ()