2012-02-13 22 views
4

私はVTD-XMLを使用して多数のXMLファイルを解析中です。ツールを正しく使用するかどうかはわかりませんが、ファイルを解析すると時間がかかりすぎます。VTD-XMLを使用してXMLファイルを解析する速度を最適化

xmlファイル(DATEXII形式)は、HD上で圧縮されたファイルです。解凍されたものは約31MBもの大きさで、わずか850.000行以上のテキストしか入っていません。私はいくつかのフィールドだけを抽出し、それらをデータベースに格納する必要があります。

import org.apache.commons.lang3.math.NumberUtils; 
... 

private static void test(File zipFile) throws XPathEvalException, NavException, XPathParseException { 
    // init timer 
    long step1=System.currentTimeMillis(); 

    // open file to output extracted fragments 
    VTDGen vg = new VTDGen(); 
    vg.parseZIPFile(zipFile.getAbsolutePath(), zipFile.getName().replace(".zip",".xml"),true); 

    VTDNav vn = vg.getNav(); 

    AutoPilot apSites = new AutoPilot(); 
    apSites.declareXPathNameSpace("ns1", "http://schemas.xmlsoap.org/soap/envelope/"); 
    apSites.selectXPath("/ns1:Envelope/ns1:Body/d2LogicalModel/payloadPublication/siteMeasurements"); 
    apSites.bind(vn); 

    long step2=System.currentTimeMillis(); 
    System.out.println("Prep took "+(step2-step1)+"ms; "); 

    // init variables 
    String siteID, timeStr; 
    boolean reliable; 
    int index, flow, ctr=0; 
    short speed; 
    while(apSites.evalXPath()!=-1) { 

     vn.toElement(VTDNav.FIRST_CHILD, "measurementSiteReference"); 
     siteID = vn.toString(vn.getText()); 

     // loop all measured values of this measurement site 
     while(vn.toElement(VTDNav.NEXT_SIBLING, "measuredValue")) { 
      ctr++; 

      // extract index attribute 
      index = NumberUtils.toInt(vn.toString(vn.getAttrVal("index"))); 

      // go one level deeper into basicDataValue 
      vn.toElement(VTDNav.FIRST_CHILD, "basicDataValue"); 

      // we need either FIRST_CHILD or NEXT_SIBLING depending on whether we find something 
      int next = VTDNav.FIRST_CHILD; 
      if(vn.toElement(next, "time")) { 
       timeStr = vn.toString(vn.getText()); 
       next = VTDNav.NEXT_SIBLING; 
      } 

      if(vn.toElement(next, "averageVehicleSpeed")) { 
       speed = NumberUtils.toShort(vn.toString(vn.getText())); 
       next = VTDNav.NEXT_SIBLING; 
      } 

      if(vn.toElement(next, "vehicleFlow")) { 
       flow = NumberUtils.toInt(vn.toString(vn.getText())); 
       next = VTDNav.NEXT_SIBLING; 
      } 

      if(vn.toElement(next, "fault")) { 
       reliable = vn.toString(vn.getText()).equals("0"); 
      } 

      // insert into database here... 

      if(next==VTDNav.NEXT_SIBLING) { 
       vn.toElement(VTDNav.PARENT); 
      } 
      vn.toElement(VTDNav.PARENT); 
     } 

    } 
    System.out.println("Loop took "+(System.currentTimeMillis()-step2)+"ms; "); 
    System.out.println("Total number of measured values: "+ctr); 
} 

私のXML-ファイルの正確な上記の関数の出力は、次のとおりです。データが実際に今、データベースに挿入されていない

Prep took 25756ms; 
Loop took 26889ms; 
Total number of measured values: 112611 

。問題は、毎分これらのファイルの1つを受け取ることです。総解析時間は1分近くです。ファイルのダウンロードには約10秒かかりますので、データベースに保存する必要があるため、今すぐリアルタイムで動作しています。

これをスピードアップする方法はありますか?私は助けにはならなかったことを試みたもの:これは実際に自分自身を提出し、VTDにバイト配列を解析30000ms

  • 解凍によって、より遅い第二のステップを作ったすべてのフィールドに

    • 使用オートパイロットは、これはしませんでした任意の違い
    • ループ自身はBufferedReaderののreadLine()を使用してファイルを作成するが、これは十分な速度ではありませんどちらか

    誰もが物事をスピードアップする可能性を参照するか、私は考え始める必要がありませんんより重いマシン/マルチスレッド?もちろん、毎分850.000行(1日あたり12億行)がたくさんありますが、31MBのデータを解析するのに1分かかることはないと感じています。

  • +0

    問題をvtd-xmlメーリングリストに投稿できますか?問題を把握するのを手伝ってくれると嬉しいです。 –

    答えて

    1

    フォルダを解凍してみることもできます離れと

    File[] files = new File("foldername").listFiles(); 
    

    とアレイ内のすべてのxmlファイルの値を格納して、あなたはすべてのファイルを通過するループを作ることができ、イムはわからない、これはそれをスピードアップするが、その価値はショットならば。

    関連する問題