[MarkLogic Dev General] XDMP-EXPNTREECACHEFULL on ML 3.2
Zegarek, Arthur
azegarek at audible.com
Thu Sep 23 20:14:50 PDT 2010
I am getting an XDMP-EXPNTREECACHEFULL error - not sure how to get around it.
Trying to write an xquery that reads through a control list to obtain a list of catalog elements tha require updating, along with a start_date/end_date value to update in main catalog.
When I load the control xml (DevWithoutExclProduct.xml ) up with more than 2000 items or so, I get XDMP-EXPNTREECACHEFULL. In memory tree size is set to 1Gb
I have 3 versions of the code - details below. I would think the 2nd or 3rd versions would not incur the problem, since in this version I isolate the logic in a function that is called with just a single node each time. I understand the issue is too many nodes being kept I scope, but how can you get around this in a single xquery call, without breaking up the data to make multiple calls to ML Server? If I limit DevWithoutExclProduct.xml to 1500 products or so, it runs through without the exception.
Currently running this in our dev environment where we have approx 54000 products in the Internal collection . In Prod it is more like 300000.
Version 1:
declare namespace RSUITE="http://www.reallysi.com"
declare namespace adbl="http://www.audible.com/publisherToRepository"
for $excl in doc("DevWithoutExclProduct.xml")/prods/product, $rsuite in collection("Internal")/product
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $prod_id := $excl/prods/product/prod_id
let $excl_content := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_CONTENT
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $exi := exists($excl_product )
let $start := $excl/start
let $end := $excl/end
let $repl_node := <adbl:EXCLUSIVE_PRODUCT><adbl:START_DATE>{$start/text()}</adbl:START_DATE><adbl:END_DATE>{$end/text()}</adbl:END_DATE></adbl:EXCLUSIVE_PRODUCT>
where $rsuite/adbl:METADATA/adbl:CORE/adbl:ID/text() = $excl/prod_id/text()
return
<a>
{
if( $exi = true() )
then
xdmp:node-replace($excl_product, $repl_node)
else
xdmp:node-insert-after($excl_content, $repl_node)
}
</a>
In this version, the control list, DevWithoutExclProduct.xml, is joined in the same for loop as the main catalog
Error returned is:
XDMP-EXPNTREECACHEFULL: for $rsuite as item()* in collection("Internal")/child::product -- Expanded tree cache full on host rsuite.ofc.dev.ewr.audible.com
line 4
=
/use-cases/eval2.xqy line 2
Version 2 - Here I tried isolating the functionality in a function, and call the function in a separate for loop that reads through the control. So I am unclear why I am setill getting the tree cache full, given that the function is called with just a single node each time. Note the difference in the error reported - here there are 2 lines mentioned.
declare namespace RSUITE="http://www.reallysi.com"
declare namespace adbl="http://www.audible.com/publisherToRepository"
define function update_excl_prod( $excl as node() ) as element() (: Call with just 1 node ! :)
{
for $rsuite in collection("Internal")/product
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $prod_id := $excl/prods/product/prod_id
let $excl_content := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_CONTENT
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $exi := exists($excl_product )
let $start := $excl/start
let $end_dt := $excl/end
let $repl_node := <adbl:EXCLUSIVE_PRODUCT><adbl:START_DATE>{$start/text()}</adbl:START_DATE><adbl:END_DATE>{$end_dt/text()}</adbl:END_DATE></adbl:EXCLUSIVE_PRODUCT>
where $rsuite/adbl:METADATA/adbl:CORE/adbl:ID/text() = $excl/prod_id/text()
return
if( $exi = true() )
then
xdmp:node-replace($excl_product, $repl_node)
else
xdmp:node-insert-after($excl_content, $repl_node)
}
<result>{
for $excl in doc("DevWithoutExclProduct.xml")/prods/product
return update_excl_prod( $excl )
}
</result>
Error returned here is:
XDMP-EXPNTREECACHEFULL: for $rsuite as item()* in collection("Internal")/child::product -- Expanded tree cache full on host rsuite.ofc.dev.ewr.audible.com
line 7
=
line 34
=
/use-cases/eval2.xqy line 2
Version 3 - Here I tried limiting the for expression to search for the item, removed the where clause.Same exception
declare namespace RSUITE="http://www.reallysi.com"
declare namespace adbl="http://www.audible.com/publisherToRepository"
define function update_excl_prod( $excl as node() ) as element() (: Call with just 1 node ! :)
{
for $rs in fn:collection('Internal')/product/adbl:METADATA/adbl:CORE/adbl:ID[.= $excl/prod_id/text() ]
let $rsuite := doc(xdmp:node-uri($rs ))/product
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $prod_id := $excl/prods/product/prod_id
let $excl_content := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_CONTENT
let $excl_product := $rsuite/adbl:METADATA/adbl:CORE/adbl:EXCLUSIVE_PRODUCT
let $exi := exists($excl_product )
let $start := $excl/start
let $end_dt := $excl/end
let $repl_node := <adbl:EXCLUSIVE_PRODUCT><adbl:START_DATE>{$start/text()}</adbl:START_DATE><adbl:END_DATE>{$end_dt/text()}</adbl:END_DATE></adbl:EXCLUSIVE_PRODUCT>
(: where $rsuite/adbl:METADATA/adbl:CORE/adbl:ID/text() = $excl/prod_id/text() :)
return
if( $exi = true() )
then
xdmp:node-replace($excl_product, $repl_node)
else
xdmp:node-insert-after($excl_content, $repl_node)
}
<result>{
for $excl in doc("DevWithoutExclProduct.xml")/prods/product
return update_excl_prod( $excl )
}
</result>
Art
Art Zegarek | Director of Data Architecture
T: 973.820.0396 F: 973.820.0505 C: 732-735-2592
audible.com
1 Washington Park, 16th Floor, Newark, NJ 07102
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://developer.marklogic.com/pipermail/general/attachments/20100923/0733abb8/attachment-0001.html
More information about the General
mailing list