ML上的任务服务器

时间:2017-07-28 14:51:30

标签: multithreading marklogic

我的查询最多可以返回2000个文档。 在这些文档中,我需要六个pcdata项作为字符串值返回。 有可能,因为文件大小从小到大, exp树缓存错误。

我正在查看spawn-function来分解我的结果集。 我将基于已知的“唯一键结构”传递通配符值,并且将知道可能的最大结果数;每个通配符值将返回最多100个文档。 注意:唯一键结构的pcdata上有一个范围索引。

我是否在正确的轨道上? 任务服务器将创建三个任务。 任务服务器将允许多个查询运行,但是什么阻止它们同时运行并吹灭exp树缓存? 即什么,如果有的话,迫使一个线程等待另一个?还是一个等待另一个任务的任务,所以他们都不会一起吹灭exp树缓存?

xquery version "1.0-ml";
let $messages := 
(:each wildcard values will return 100 documents max:)
for $message in ("WILDCARDVAL1","WILDCARDVAL2", "WILDCARDVAL3")
let $_ := xdmp:log("Starting")
return
    xdmp:spawn-function(function() {  
    let $_ := xdmp:sleep(5000)
    let $_ := xdmp:log(concat("Searching on wildcard val=", $message))
    return concat("100 pcdata items from the matched documents for ", $message) },
    <options xmlns="xdmp:eval">
      <result>true</result>
      <transaction-mode>update-auto-commit</transaction-mode>
    </options>)
return $messages

2 个答案:

答案 0 :(得分:1)

Admin UI中列出的Task Server配置定义了最大并发线程数。如果生成的任务多于线程,则它们会排队(FIFO我认为,虽然ML9具有修改该行为的任务优先级选项),并且第一个排队任务将获取下一个可用线程。

<result>true</result>选项将强制生成查询,直到任务返回为止。任务本身是独立运行并且并行运行,并且它们不会等待彼此完成。您可能仍然遇到扩展树缓存的问题,但通过将查询拆分为较小的查询,可能不太可能。

为了更好地理解为什么要烧掉缓存,请查看函数xdmp:query-trace()xdmp:query-meters()。使用Task Server更像是一个强力解决方案,通过使用这些函数中的信息优化查询,您可能会获得更好的结果。

如果您不能使查询比2000文档更具选择性,但您只需要几个字符串值,请考虑在这些值上创建范围索引,并使用cts:values直接从索引中选择这些值,由查询过滤。该方法可以避免强制数据库将文档加载到缓存中。

答案 1 :(得分:1)

使用MarkLogic的功能可能更有效地使用cts:values等函数从文档中返回共现,甚至3 +元组值组合。您可以混合使用(cts:uri-reference](http://docs.marklogic.com/cts:uri-reference)来获取作为元组的一部分返回的文档uri。

它要求所有这些值都有范围索引..

HTH!