java压缩xml文件_java – 使用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秒钟,我需要将数据存储在数据库中,我现在正在实时运行.

有什么方法可以加快速度吗?我试过的东西没有帮助:

>对所有字段使用autopilots,这实际上使第二步减慢了30000ms

>自己解压缩文件并将字节数组解析为VTD,这没有任何区别

>使用BufferedReader readLine()自行循环文件,但这也不够快

有没有人看到加快速度的可能性,还是我需要开始考虑更重的机器/多线程?当然,每分钟850.000行(每天12亿行)很多,但我仍然觉得解析31MB数据不应该花一分钟……

解决方法:

您可以尝试立即解压缩文件夹并将每个xml文件的值存储在数组中

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

然后你可以制作一个遍历每个文件的循环,我不确定这是否会加快速度,但值得一试.

标签:java,xml-parsing,vtd-xml

来源: https://codeday.me/bug/20190709/1416555.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值