2012-02-13 1 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 분이며, 파일을 다운로드하는 데 약 10 초가 걸리고 데이터베이스에 물건을 저장해야하므로 지금 실시간으로 실행되고 있습니다.

속도를 향상시킬 방법이 있습니까? 상황이 내가 도움이되지 않았다 시도했다 : 모든 필드에 대한

  • 를 사용하여 자동 조종 장치, 이것은 실제로 30000ms
  • 의 압축을 풀고 파일에 의해 두 번째 단계 느리게 만들어 자신과 VTD에 바이트 배열을 구문 분석이하지 않았다 차이
  • 루프 나 자신이의 BufferedReader 내의 readLine()를 사용하여 파일을 만들지 만,이 충분히 빠르지 중 하나

사람이 일을 빠르게 할 수있는 가능성을 확인하거나 내가 생각하고 시작해야합니까 더 무거운 기계/멀티 스레딩? 물론, 1 분당 850.000 라인 (하루에 12 억 라인)은 많이 있지만, 31MB의 데이터를 분석하는 데 1 분이 걸리지 않아야한다고 생각합니다. ...

+0

vtd-xml 메일 링리스트에 문제를 게시 할 수 있습니까? 문제를 파악하는 데 도움이 될 수있어서 기쁩니다. –

답변

1

폴더를 압축 해제 할 수 있습니다 거리와

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

와 배열에있는 모든 XML 파일의 값을 저장 한 다음 모든 파일을 통과 루프를 만들 수, 임은 확실하지이는 속도를하지만, 그 가치 탄한다면.