java – 使用VTD-XML优化解析XML文件的速度
发布时间:2020-12-15 02:31:39 所属栏目:Java 来源:网络整理
导读:我正在使用VTD- XML解析大量 XML文件.我不确定我是否正确使用该工具 – 我想是这样,但解析文件花了我太久. xml文件(DATEXII格式)是HD上的压缩文件.打开包装,它们大约31MB,包含超过850.000行文本.我只需要提取几个字段并将它们存储在数据库中. import org.apa
我正在使用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 有没有人看到加快速度的可能性,还是我需要开始考虑更重的机器/多线程?当然,每分钟850.000行(每天12亿行)很多,但我仍然觉得解析31MB数据不应该花一分钟…… 解决方法
您可以尝试立即解压缩文件夹并将每个xml文件的值存储在数组中
File[] files = new File("foldername").listFiles(); 然后你可以制作一个遍历每个文件的循环,我不确定这是否会加快速度,但值得一试. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |