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 분이 걸리지 않아야한다고 생각합니다. ...
vtd-xml 메일 링리스트에 문제를 게시 할 수 있습니까? 문제를 파악하는 데 도움이 될 수있어서 기쁩니다. –