VTD-XML解析的优化?

时间:2016-08-17 14:30:43

标签: java xml performance vtd-xml

我必须对VTD-XML库进行性能测试,以便不仅可以进行简单的解析,还可以在解析中进行额外的转换。 所以我有30MB输入XML,然后我用自定义逻辑将其转换为其他XML。 所以我想删除所有想法,这些想法会减慢来自我身边的整个过程(因为没有很好地使用VTD库)。 我试图搜索优化提示,但找不到它们。 我说:

'0'。什么更适合用于选择selectXPath或selectElement?

  1. 使用不带命名空间的解析要快得多。

    File file = new File(fileName);
    VTDGen vtdGen = new VTDGen(); 
    vtdGen.setDoc_BR(new byte[(int) file.length()]); 
    vtdGen.parse(false);
    
  2. Read from byte or pass VTDGen

    final VTDGen vg = new VTDGen();
    vg.parseFile("books.xml", false);
    
  3. // 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没有,但字节方法是什么?

    1. 重用缓冲区
    2.   

      您可以要求VTDGen将VTD缓冲区重用于下一个解析任务。   否则,默认情况下,VTDGen将为每个分配新的缓冲区   解析运行。

      你能举一个例子吗?

      1. 将LC水平调整为5
      2.   

        默认情况下,它是3.但您可以将其设置为5.当您的XML深入时   嵌套,将LC级别设置为5会产生更好的XPath性能。但   它会略微增加内存使用量和解析时间。

            VTDGen vg = new VTDGen();
            vtdGen.selectLcDepth(5);
        

        但是有运行时异常。仅适用于3

        1. 索引
        2.   

          使用VTD + XML索引 - 而不是在解析XML文件时   处理请求,您可以将XML预先索引为VTD + XML格式和   将它们转储到磁盘上。处理请求开始时,只需加载   内存中的VTD + xml,不再需要解析!!

            VTDGen vg = new VTDGen();
              if (vg.parseFile(inputName,true)){
                 vg.writeIndex(new FileOutputStream(outputName));
               }
          

          有谁知道如何使用它?如果文件发生变化会发生什么,如何重新编制索引。如果在3GB中有10kb的更改,解析将花费时间进行整个新文件解析或仅用于更改的行吗?

          1. 覆盖功能
          2.   

            覆盖功能又称。数据模板 - 因为VTD-XML保留   在内存中的XML,你实际上可以创建一个模板XML文件   (在vtd + xml中预先编入索引),其值字段留空并让   您的应用填写空白,从而创建永远不需要的XML数据   被解析。

1 个答案:

答案 0 :(得分:0)

我认为你应该看看与vtd-xml发布捆绑的示例......并逐渐建立专业知识...幸运的是,vtd-xml在我看来是最容易的XML API之一。所以学习曲线不会是SAX / STAX的那种困难。

我对上面编号清单的回答......

  1. selectXPath用于xpath评估。 selectElement类似于getElementByTag()

  2. 启用命名空间感知对解析性能几乎没有影响...您能参考100x减速声明的来源吗?

  3. 您可以直接从字节读取或从文件中读取...这是指向博客文章的链接

    https://ximpleware.wordpress.com/2016/06/02/parsefile-vs-parse-a-quick-comparison/

  4. 3.缓冲重用在某种程度上是一种先进的功能..在以后的时间里可以使用

    4.如果您获得最新版本(2.13),那么您将不会通过该方法调用获得运行时异常...

    1. 解析大于2GB的xml doc,需要切换到vtd-xml的扩展版本,这是一个与标准vtd-xml捆绑在一起的独立API ...

    2. 您可能希望首先查看与vtd-xml发行版捆绑在一起的示例...这里有一篇关于此主题的文章 http://www.codeproject.com/Articles/24663/Index-XML-Documents-with-VTD-XML