- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用 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 的数据不应该花费一分钟......
最佳答案
您可以尝试立即解压缩文件夹并将每个 xml 文件的值存储在一个数组中
File[] files = new File("foldername").listFiles();
然后你可以创建一个遍历每个文件的循环,我不确定这是否会加快速度,但值得一试。
关于java - 使用 VTD-XML 优化解析 XML 文件的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9267196/
因为如果线程安全,我可以在整个应用程序中仅使用VTDGen的一个实例。 现在,我为每个请求实例化一个新的VTDGen,我正在考虑将其设置为static,以便仅对其进行一次初始化。 最佳答案 线程安全到
问题是有些 xml 文件在 xml 中没有可用的 header 信息。解析 xml 文件时,vtd-xml 默认使用 utf-8 并抛出异常,提示无法解析文档。 (xml 编码是 8859-2,但没有
使用Java 2.11版本。我正在基于 CD Catalog 数据绑定(bind)示例构建 xml 绑定(bind)组件。我有一个相当复杂但相当小的文档,大约 2000 字节。而且 AutoPilot
我有巨大的 xml,因此我有很多 xpath 来从 xml 中提取条目。所以我尝试生成多个线程,以便每个 xpath 可以在不同的线程中进行评估。但是我收到以下错误是可以给出一个公平想法的代码片段,为
我用java实现了VTD-Parser,它成功地轻松解析了大约500 MB的XML文件,并且能够在Excel中写入。我理解DOM解析器首先创建树节点结构然后获取数据,而SAX是基于事件的解析器。但是是
我在使用 vtd-xml 库(版本 2.11)时遇到编码问题。 @Test public void test() throws Exception { final String
在VTDNav docs我看到了获取 attrubites 的值、获取元素的文本值的方法,但我真的找不到,如何获取当前元素的标签名称? 最佳答案 vn.toRawString(vn.getCurren
我正在尝试解析以下 XML 并创建与主要元素相对应的 Java 对象: wood 12 ... someone 200
我决定使用 VTD-Xml 来解析一个非常大的文件。它工作得很好,但在解析过程中,可以进行验证检查,必须使用已验证字段(行和列)的位置进行记录。我找不到任何方法来使用 VTD 至少获取元素的行号。而且
我正在处理平均 18 MB 的 XML,其中 XPaths 大量使用谓词。我尝试分析处理过程(预热 JVM),平均处理时间为 20 秒。我想知道是否有使它更快的技术?比如避免使用谓词? 最佳答案 如果
嘿,我正在尝试使用 VTD-XML 来解析作为字符串提供给它的 XML,但我找不到如何去做。任何帮助将不胜感激。 http://vtd-xml.sourceforge.net 最佳答案 VTD-XML
我在尝试通过 getElementFragmentNs 提取元素时遇到问题。 这里是示例测试: @Test public void shouldNotShadowNamespaceAn
我正在尝试使用 VTD-XML 从父元素中删除一组子元素。 不幸的是,删除元素后,它会留下被删除元素先前占用的新行。 VTD-XML 作者 here 撰写的有关 VTD-XML 的文章的读者也观察到了
我有以下 XML 片段,我想使用 Ximpleware/VTD-XML 从中剥离属性并输出为新的 XML。来源: 目标: 我知道我可以使用 removeAttrib
我有一个 xpath 查询,我可以获得所有属性及其各自的值 但现在我想知道这些属性属于哪个元素? 这是我的 xml:
这个问题已经有答案了: Compile Error: Cannot Find Symbol (2 个回答) 已关闭 7 年前。 我不是 Java 程序员,但需要编写 Java 程序来解析大型(400m
使用 VTD-XML 解析器我该怎么做? 1 2 3 1 2
我有一个 XML block ,如下所示,其中包含 3 个 AttachmentBinary 元素(尽管为了可读性而被截断): 219 /9j/4UK8RXhpZgAAS
给定属性的 xpath 和新值,我希望将属性值更新为新值。 我按照这里的例子:http://vtd-xml.sourceforge.net/codeSample/cs7.html并提出以下内容: au
我有一个像这样的 XML: 1 2 3 4 是否可以使用 Java 和 VT
我是一名优秀的程序员,十分优秀!