小编典典

Java中的并行XML解析

java

我正在编写一个处理具有深节点结构的xml文件(>
1000)的应用程序。使用woodstox(事件API)大约需要6秒钟来解析具有22.000个节点的文件。

该算法被置于与用户交互的过程中,其中只有几秒钟的响应时间是可以接受的。因此,我需要改进如何处理xml文件的策略。

  1. 我的过程分析xml文件(仅提取几个节点)。
  2. 处理提取的节点,并将新结果写入新的数据流(产生具有修改后的节点的文档副本)。

现在,我正在考虑一种多线程解决方案(在16个Core +硬件上可更好地扩展)。我想到了以下策略:

  1. 创建多个解析器并在xml源上并行运行它们。
  2. 重写我的解析算法线程保存以仅使用解析器的一个实例(工厂,…)
  3. 将XML源拆分为多个块,并将这些块分配给多个处理线程(map-reduce xml-serial
  4. 优化我的算法(StAX解析器比woodstox更好吗?)/使用内置并发解析器

我想同时改善整体性能和“每个文件”的性能。

您是否有处理此类问题的经验?最好的方法是什么?


阅读 211

收藏
2020-11-16

共1个答案

小编典典

  1. 这很明显:只需创建多个解析器,然后在多个线程中并行运行它们即可。

  2. 看看Woodstox的性能(此刻请尝试使用Google缓存)。

  3. 如果XML的结构是可预测的,则可以做到这一点:如果它具有很多相同的顶级元素。例如:

    <element>
    <more>more elements</more>
    



    other elements

在这种情况下,您可以创建简单的拆分器,<element>该拆分器将搜索该部分并将其提供给特定的解析器实例。这是一种简化的方法:在现实生活中,我将使用RandomAccessFile查找开始停止点(<element>),然后创建仅对文件的一部分进行操作的自定义FileInputStream。

  1. 看一看阿尔托。创造了伍德斯托克斯的那个家伙。这是该领域的专家-不要重新发明轮子。
2020-11-16