私は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分かかることはないと感じています。
問題をvtd-xmlメーリングリストに投稿できますか?問題を把握するのを手伝ってくれると嬉しいです。 –