From: <Lar...@ie...> - 2010-11-23 00:21:39
|
Hi, I got an quite confising Problem: If a xquery scrip I execute on different documents in eXist (final goal is to execute on the whole collection). Now if I take a rather small document e.g. 100KB the execution takes a time but works. When I use a bigger Dokument e.g. 20MB the execution fails an my oxygen-editor I user displays an Time-Out error. When I then try to execute the query on the smaller document again it also gets the timeout untill I restart eXist. Currently I'm testing on the Stand-Alone-Modus using RPC, befor that when using REST-API the performance was even worse. Anyone an Idea how I can solve these problem? regards Lars-Olof Krause |
From: Adam R. <ad...@ex...> - 2010-11-23 00:31:57
|
Do you see any exceptions or usefull information in exist.log? Which version of eXist are you using? Are you making us What part of your query is slow? Perhaps we could help you to optimise it? On 23 Nov 2010 00:21, "Lars-Olof Krause" < Lar...@ie...> wrote: > Hi, > > I got an quite confising Problem: > > If a xquery scrip I execute on different documents in eXist (final goal > is to execute on the whole collection). > Now if I take a rather small document e.g. 100KB the execution takes a > time but works. > When I use a bigger Dokument e.g. 20MB the execution fails an my > oxygen-editor I user displays an Time-Out error. > When I then try to execute the query on the smaller document again it > also gets the timeout untill I restart eXist. > > Currently I'm testing on the Stand-Alone-Modus using RPC, befor that > when using REST-API the performance was even worse. > > Anyone an Idea how I can solve these problem? > > regards > > Lars-Olof Krause > > > ------------------------------------------------------------------------------ > Increase Visibility of Your 3D Game App & Earn a Chance To Win $500! > Tap into the largest installed PC base & get more eyes on your game by > optimizing for Intel(R) Graphics Technology. Get started today with the > Intel(R) Software Partner Program. Five $500 cash prizes are up for grabs. > http://p.sf.net/sfu/intelisp-dev2dev > _______________________________________________ > Exist-development mailing list > Exi...@li... > https://lists.sourceforge.net/lists/listinfo/exist-development |
From: Adam R. <ad...@ex...> - 2010-11-23 18:07:20
|
On 23 November 2010 15:05, Lars-Olof Krause <Lar...@ie...> wrote: > Hi, > > thanks for your reply. > > It's quit strange, there are no usefull information in the exist.log... > eXist seems not to log an Error, when I get the timeout. So it is the client that is timing out and not the server... > My Query is not that complex. It seems that the whole thing is quit > slow. Okay this query can definitely be improved, my comments are inline, and the updated query is at the end - > xquery version "1.0"; > declare namespace cnxde="http://www.text-technology.de/cnxde"; > > <results> > { > for $d in > xmldb:document("loewe-a3/tocs/layers/cnxp_u8/raithel_paedagogik_2007-cnxp.xml") You dont need a "for" here as you are only passing in one uri to xmldb:document() therefore you will only get one document node as a result. Also dont use xmldb:document(), use fn:doc() instead. > let $document := substring-after(base-uri($d),'/db/') You dont need this, you can just use fn:document-uri() > for $h in $d//cnxde:token[@lemma = 'erziehung'] You can use "eq" instead of "=" here because you are comparing two atomic values as opposed to a sequence against an atomic value. > let $id := fn:number(substring-after($h/@id, 'w')) > return > <result doc="{$document}" docID="{$id}"> > <word>{$h/text()}</word> > { > for $n in 1 to 10 > for $w in $d//cnxde:token > let $wi := $id - $n This assignment can be done in the outer for, which means less re-calculation of the same value... > where $w/@id = fn:concat('w', fn:string($wi)) You should avoid the where clause in eXist-db, this can be rewritten as a predicate. > return > <wordbefore id="{$wi}">{$w/text()}</wordbefore> > } You can entirely avoid this next set of expressions by combining them with the expressions above. > { > for $n in 1 to 10 > for $w in $d//cnxde:token > let $wi := $id + $n > where $w/@id = fn:concat('w', fn:string($wi)) > return > <wordafter id="{$wi}">{$w/text()}</wordafter> > } > </result> > } > </results> > ----------------- So a rewritten query would look something like this - xquery version "1.0"; declare namespace cnxde="http://www.text-technology.de/cnxde"; <results> { let $d := fn:doc("/db/loewe-a3/tocs/layers/cnxp_u8/raithel_paedagogik_2007-cnxp.xml") return for $h in $d//cnxde:token[@lemma eq 'erziehung'] let $id := fn:number(substring-after($h/@id, 'w')) return <result doc="{fn:document-uri(fn:root($d))}" docID="{$id}"> <word>{$h/text()}</word> { (: rewritten as two independent expressions using predicates :) (: for $n in 1 to 10 let $wi := $id - $n for $w in $d//cnxde:token[@id eq fn:concat('w', fn:string($wi))] return <wordbefore id="{$wi}">{$w/text()}</wordbefore> , for $n in 1 to 10 let $wi := $id + $n for $w in $d//cnxde:token[@id eq fn:concat('w', fn:string($wi))] return <wordafter id="{$wi}">{$w/text()}</wordafter> :) (: rewritten as a single expression :) for $n in -10 to 10 let $wi := $id + $n for $w in $d//cnxde:token[@id eq fn:concat('w', fn:string($wi))] return element {if($wi lt $id)then("wordbefore")else("wordafter")} { attribute id { $wi }, $w/text() } } </result> } </results> You might want to play with the evaluation expression inside the if statement here - if($wi lt $id)then("wordbefore")else("wordafter") - to ensure that you get the correct mix of wordbefore and wordafter. You might also like to setup an indexes on @lemma and @id, this will probably give you the biggest speed up. But it would be interesting to see how my rewritten query performs, I dont have your data to test against I am afraid... Cheers Adam. -- Adam Retter eXist Developer { United Kingdom } ad...@ex... irc://irc.freenode.net/existdb |