Java中的并行XML解析

Mar*_* K. 11 java xml parallel-processing multithreading xml-parsing

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

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

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

现在我正在考虑一个多线程解决方案(在16核+硬件上可以更好地扩展).我想到了以下国家:

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

我想同时提高,整体性能和"每个文件"的表现.

你有这方面的经验吗?什么是最好的方式?

Pet*_*ego 4

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

  2. 看看Woodstox 性能(目前已关闭,请尝试谷歌缓存)。

  3. 如果 XML 的结构是可预测的:如果它具有许多相同的顶级元素,则可以完成此操作。例如:

    <element>
        <more>more elements</more>
    </element> 
    <element>
        <other>other elements</other>
    </element>
    
    Run Code Online (Sandbox Code Playgroud)

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

  4. 看看阿尔托。创造伍德斯托克斯的人也是同一个人。这是该领域的专家 - 不要重新发明轮子。