我必须对VTD-XML库进行性能测试,以便不仅可以进行简单的解析,还可以在解析中进行额外的转换。 所以我有30MB输入XML,然后我用自定义逻辑将其转换为其他XML。 所以我想删除所有想法,这些想法会减慢来自我身边的整个过程(因为没有很好地使用VTD库)。 我试图搜索优化提示,但找不到它们。 我说:
'0'。什么更适合用于选择selectXPath或selectElement?
使用不带命名空间的解析要快得多。
File file = new File(fileName);
VTDGen vtdGen = new VTDGen();
vtdGen.setDoc_BR(new byte[(int) file.length()]);
vtdGen.parse(false);
Read from byte or pass到 VTDGen ?
final VTDGen vg = new VTDGen();
vg.parseFile("books.xml", false);
或
// open a file and read the content into a byte array
File f = new File("books.xml");
FileInputStream fis = new FileInputStream(f);
byte[] b = new byte[(int) f.length()];
fis.read(b);
VTDGen vg = new VTDGen();
vg.setDoc(b);
vg.parse(true);
使用第二种方法 - 快0.01倍......(可以来自所有方法)
与parseFile有什么不同,文件被限制为2GB,其中namespaceaware为true而1GB没有,但字节方法是什么?
您可以要求VTDGen将VTD缓冲区重用于下一个解析任务。 否则,默认情况下,VTDGen将为每个分配新的缓冲区 解析运行。
你能举一个例子吗?
默认情况下,它是3.但您可以将其设置为5.当您的XML深入时 嵌套,将LC级别设置为5会产生更好的XPath性能。但 它会略微增加内存使用量和解析时间。
VTDGen vg = new VTDGen();
vtdGen.selectLcDepth(5);
但是有运行时异常。仅适用于3
使用VTD + XML索引 - 而不是在解析XML文件时 处理请求,您可以将XML预先索引为VTD + XML格式和 将它们转储到磁盘上。处理请求开始时,只需加载 内存中的VTD + xml,不再需要解析!!
VTDGen vg = new VTDGen();
if (vg.parseFile(inputName,true)){
vg.writeIndex(new FileOutputStream(outputName));
}
有谁知道如何使用它?如果文件发生变化会发生什么,如何重新编制索引。如果在3GB中有10kb的更改,解析将花费时间进行整个新文件解析或仅用于更改的行吗?
覆盖功能又称。数据模板 - 因为VTD-XML保留 在内存中的XML,你实际上可以创建一个模板XML文件 (在vtd + xml中预先编入索引),其值字段留空并让 您的应用填写空白,从而创建永远不需要的XML数据 被解析。
答案 0 :(得分:0)
我认为你应该看看与vtd-xml发布捆绑的示例......并逐渐建立专业知识...幸运的是,vtd-xml在我看来是最容易的XML API之一。所以学习曲线不会是SAX / STAX的那种困难。
我对上面编号清单的回答......
selectXPath用于xpath评估。 selectElement类似于getElementByTag()
启用命名空间感知对解析性能几乎没有影响...您能参考100x减速声明的来源吗?
您可以直接从字节读取或从文件中读取...这是指向博客文章的链接
https://ximpleware.wordpress.com/2016/06/02/parsefile-vs-parse-a-quick-comparison/
3.缓冲重用在某种程度上是一种先进的功能..在以后的时间里可以使用
4.如果您获得最新版本(2.13),那么您将不会通过该方法调用获得运行时异常...
解析大于2GB的xml doc,需要切换到vtd-xml的扩展版本,这是一个与标准vtd-xml捆绑在一起的独立API ...
您可能希望首先查看与vtd-xml发行版捆绑在一起的示例...这里有一篇关于此主题的文章 http://www.codeproject.com/Articles/24663/Index-XML-Documents-with-VTD-XML