2013-02-04 8 views
8

Używam marklogic 4 i mam około 15000 dokumentów (każdy z około 10 KB). Chcę załadować całą zawartość jako dokument (i przekonwertować wszystkie dokumenty do jednego pliku CSV i wyprowadzić do strumienia wyjściowego HTTP do pobrania). A ja załadować dokumenty w ten sposób:unikanie XDMP-EXPNTREECACHEFULL i ładowanie dokumentu

let $uri := cts:uri-match('products/documents/*.xml') 
let $doc := fn:doc ($uri) 

XPath ma jakieś 15.000 plików XML. Tak więc fn: doc zgłasza błąd XDMP-EXPNTREECACHEFULL.

Czy istnieje sposób obejścia tego problemu? Nie mogę zwiększyć rozmiaru pamięci podręcznej drzewa w konsoli administratora, ponieważ liczba plików xml w produktów/dokumentów/*. Xml może wzrosnąć.

Dzięki.

Odpowiedz

8

Jeśli chcesz wyeksportować duże ilości XML z MarkLogic, najlepszą techniką jest napisanie zapytania, aby wyniki mogły być przesyłane strumieniowo, unikając w pełni rozwiniętego drzewa podręcznego drzewa. Jest to jednak bardzo odmienny styl kodowania: musisz unikać silnego typowania i odnawiać kod, aby usunąć wyrażenia FLWOR. Nie będzie można przetestować żadnego z kodów w cq lub qconsole.

Zapoznaj się z http://blakeley.com/blogofile/2012/03/19/let-free-style-and-streaming/, aby uzyskać wskazówki, jak się tam dostać. Przy minimum przykładowy kod zostanie zaksięgowana musiałby stać:

doc(cts:uri-match('products/documents/*.xml')) 

Na marginesie chciałbym spróbować przerobienie że aby uniknąć *.xml rolę, ponieważ będzie wolniejszy niż potrzeba. Może coś takiego?

cts:search(
    collection(), 
    cts:directory-query('products/documents/', 'infinity')) 

Jeśli trzeba testować czegoś więcej niż katalog, można dodać cts:and-query z jakiegoś testu cts:element-query.