我正在使用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秒钟,我需要将数据存储在数据库中,我现在正在实时运行。
有没有办法加快速度?我尝试过的事情没有帮助:
有没有人看到加快速度的可能性,还是我需要开始考虑更重的机器/多线程?当然,每分钟850.000行(每天12亿行)很多,但我仍然觉得解析31MB数据不应该花一分钟......
答案 0 :(得分:1)
您可以尝试立即解压缩文件夹,并将每个xml文件的值存储在数组中
File[] files = new File("foldername").listFiles();
然后你可以创建一个遍历每个文件的循环,我不确定这是否会加快速度,但值得一试。