2

URI に xml 形式で約 15000 のレコードがありますdocuments/products/specs/*.xml。各 xml のサイズは約 25 キロバイトです。(Java)を持つリモートApache Tomcatサーバーを使用して、このmarklogicサーバーに接続しました。これは、次のようなものXCC clientを実行しようとします。AdHocQuery

let $a := cts:uri-match('documents/products/specs/*.xml')
          for $xml in $a
          return fn:doc($a)

(for ループは Java で実装されています)。

これはうまくいきます。しかし、たとえば 15000 レコードなど、より大きな数のレコードの場合、すべてのサーバーとインターネットの速度が非常に良好な場合、60 分かかります。(URI 内のすべてのドキュメントの合計サイズは約 20 MB で、20 分以上かかることはありません)。

回避策はありますか?

4

3 に答える 3

2

これを試して:

cts:search(
    fn:doc(),
    cts:document-query(
        cts:uri-match('documents/products/specs/*.xml')
    ), "unfiltered"
)
于 2013-03-12T18:02:23.553 に答える
1

あなたがしていることは、すべての文書の全体を要求することです。これは一般的なクエリではなく、DBダンプです。表示するクエリは、このすべてのデータをバッファリングしてから、Tomcatを介して送信します。Tomcatは、すべてのデータを再度バッファリングしてから、送信します。これは、1つのリクエストで送信する大きなデータセットです。

クエリの目的は何ですか?すべてのドキュメントを取得する場合は、mlcpなどのプログラムを使用してそれらをダンプするか、最初にURIを収集してからドキュメントをフェッチすることにより、それらをより小さなバッチでフェッチする必要があります。これは、ドキュメントのフェッチを並行して実行することで大幅に高速化できます。XCCでドキュメントを並行してフェッチする方法を示すxmlshのJavaソースの例を見ることができます

http://xmlsh.svn.sourceforge.net/viewvc/xmlsh/extensions/marklogic/src/org/xmlsh/marklogic/get.java?revision=792&view=markup

私の推測(私が間違っている場合は訂正してください)は、あなたはただ実験しているだけで、実際にはすべてのドキュメントを必要としないということです。その場合、より現実的なクエリを試す必要があります。

于 2013-02-21T11:57:40.283 に答える
0

クエリに非常に時間がかかる理由は、これらのファイルのほとんどについて、Marklogicサーバーがディスクから読み取りを行っているためです。ツリーキャッシュのサイズが非常に大きい場合を除きます。あなたがする必要があるのはあなたの質問の範囲を下げることです。たぶん、ファイルにいくつかのインデックスを追加します。

つまり、データをETLするだけの場合は、リクエストをバッチ処理することをお勧めします。

于 2013-03-01T20:54:37.123 に答える