2016-08-22 6 views
0

私の組織では、大きなxml変換を行うためにxslt 1.0とxpath 1.0を使用しています。しかし今、私たちはマイグレーションを行う必要があります。VTD-XMLで多くのAutoPilotオブジェクトインスタンスを作成/渡す方法は?

私は巨大なXMLの200メガバイトを解析して変換するVTD-XMLを使用していると私は私が定義したいそれらのそれぞれのためのように、20以上のxpathが選択されてい:

AutoPilot relationAutoPilot = new AutoPilot(); 
relationsautoPilot.selectXPath("object[@class='Example']"); 

AutoPilot first= new AutoPilot(); 
first.selectXPath("other"); 
.... 

public void methodCalulate(final VTDNav partAutoPilot, final AutoPilot partAutoPilot, final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) { 
    navigator.push(); 
    partAutoPilot.bind(navigator); 
    while ((i = partAutoPilot.evalXPath()) != -1) { 
    ... 
    method3(navigator,first,second,third,fourth); 
    .. 
    } 

method3(final VTDNav navigator,final AutoPilot first, final AutoPilot second,final AutoPilot third,final AutoPilot fourth) { 
    navigator.push(); 
    first.bind(navigator); 
    int i = -1; 

    while ((i = first.evalXPath()) != -1) { 
      //Do some buissiness logic 
    method2(navigator,second,third,fourth); 
    .. 
    } 
} 

だから私はそれらを入れてみましたwhile、for-eachなどではなく、プロセッサの速度とメモリを消費することはできませんが、問題があります。

  1. シンプルなケース

    public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot) 
    

OK 1つのオートパイロットOK:私はので、オブジェクトを渡す方法を疑問に思って。

  • より複雑ケース methodCalculateはmethod3-を呼び出す> method2-を呼び出す>方法1

    public void methodCalculate(final VTDNav navigator, final AutoPilot partAutoPilot, final AutoPilot first,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){ 
    method3(navigator,first,second,third,fourth); 
    } 
    public void method3(final VTDNav navigator,final AutoPilot second,final AutoPilot third,final AutoPilot fourth){ 
        method2(navigator,second,third,fourth); 
    } 
    .... 
    
  • を呼び出し、すべての方法は、私は副相対のXPathで選択を必要と変換のための新しい規則があっても4つのオートパイロットを渡す必要があります。method_0が来ることがあります。私は追加のオートパイロットを追加する必要があります。 このような状況でどのように進めるのでしょうか?どのようにAutoObjectsをより効率的に渡すのですか?多くのメモリを消費し、その計算が非常に高価なためです。

    私は何を試していますか? methodCalulateが呼び出されるメソッドの最上位からAutoPilotを抽出して、一度作成するようにします。また、methodCalulateでは他のオートパイロットを作成します。速度は向上しますが、オートパイロットを作成する次のインラインコールではパフォーマンスが低下します。

    編集: 私はAutoPilotを使ってリストを追加することもできますし、地図とキーの定数クラスを使って、特定のオートパイロットを検索することもできます。私はここで何が最善の選択肢か分からない。

    +0

    すべてのautoPilotオブジェクトのトップレベルストレージとして配列またはarrayListを使用することを検討しましたか?あなたはループからxpathコンパイルを取る正しい道に...私が言うことができる限り... –

    +0

    質問投稿にもっと具体的にしてください...私はあなたにアドバイスを与えることができます、またはより良いコード例あなたがvtd-xmlにしたいことの詳細例を投稿できるのであれば... –

    +0

    私はこの問題を解決する方法のアドバイスを探しています。パスを渡す場合どのxpathオートパイロットが必要なのかわからないのですか? もっと正確にするには?私はxsltのような変換を行いたいが、VTD-XMLでjavaを使うと、xpath selectに基づいて最初のレベルのオブジェクトを反復し始め、次に属性、サブ要素などを反復処理する。レベルが上がれば、新しいオートパイロットで新しい選択が必要になります。 Aが私の質問を編集します。 – Xelian

    答えて

    1

    AutoPilotのコンパイルはループ外で実行する必要がありますが、多くのメモリを消費しません...おそらくautoPilotオブジェクトをすべてハッシュテーブルに入れ、xpath文字列をハッシュキーとして使用できます...

    おそらく気づいたように、vtd-xmlのxpath評価はループで行われます。これはDOMとは非常に異なります。これに慣れるのは少し難しいかもしれませんが、優れたパフォーマンスと低いメモリ使用率を実現するには、多くのメリット/メリットがあります。

    また、1つの子タグルックアップを含む単純なxpathの場合、xpathを忘れて、代わりにアプリケーションロジックをカーソルに直接置くことができます。同じ規則が適用されます:カーソル位置がアプリケーションロジックはそのコードブロックを離れると変更されません。

    したがって、いくつかのオプションがあります。最も一般的なのはプッシュポップ()です。しかし単純な子参照の場合、toElement(FirstChild)を呼び出した後、開始位置に戻るためにtoElement(Parent)を呼び出すだけです。

    関連する問題