【问题标题】:Task server on MLML 上的任务服务器
【发布时间】:2017-07-28 14:51:29
【问题描述】:

我的查询最多可能返回 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

【问题讨论】:

    标签: multithreading marklogic


    【解决方案1】:

    管理 UI 中列出的 Task Server 配置定义了最大并发线程数。如果产生的任务多于线程数,它们就会排队(我认为是 FIFO,尽管 ML9 具有修改该行为的任务优先级选项),并且第一个排队的任务会占用下一个可用线程。

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

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

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

    【讨论】:

    • 通过通配符值,没有任何个人任务可以处理超过 100 个文档。不幸的是,此时不能真正改变数据结构。已考虑所需值的范围索引。
    • 我知道他们不会互相等待,但如果资源不可用,他们不会“运行”。即 8 个任务都使用 exp 树缓存运行,因此它们“阻塞”。所以只有资源是最大线程数,这将迫使它们排队。
    • @paulj 是的,但是通过拆分作业,您可能会阻止缓存一次全部归档,在这种情况下,更少的任务线程可能更适合您的查询。任何读取文档的内容都将从扩展的树缓存中读取,这不会在线程级别上阻塞。范围索引可能是您最好的选择。
    【解决方案2】:

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

    但它需要对所有这些值都有范围索引..

    HTH!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-02
      • 2020-05-03
      • 1970-01-01
      • 2022-12-24
      • 2019-05-12
      • 1970-01-01
      相关资源
      最近更新 更多