在解析文本的这种情况下,无法找出正确的数据结构和正确的方法

时间:2014-10-04 19:38:50

标签: java multithreading parsing architecture executor

我正在处理文本文档解析应用程序。

文档的设计如图figure

所示

以下是解析的完成方式:

  1. 文档包含页面的ArrayList

  2. 每个页面都有 Map<float, List<Character>>

  3. float值包含字符位置的yaxis值,因此key和字符包含其他信息。

    解析是通过第三方库逐个字符完成的。如果需要更多信息,请添加评论。

    现在解析时我创建了两个ExecutorService线程池,一个用于页面,一个用于填充map。

    我最初创建了一个文档,并将每个页面传递给page parser,作为ExecutorService的可运行。然后将empty map传递给文本解析器。

    文本解析器检查map是否具有键值    如果是,则将该字符添加到列表或新列表中。

    这里的问题是,可以同时为所有页面完成此任务,以加快执行速度。但是我无法处理这个数据结构,因为如果正常解析并且使用Collections.synchronizedMap以同步方式完成所有线程,则会花费很多时间。

    另外,我维护两个不同的Future对象列表来检查线程是否完成。

    请为改进和并发执行提供有价值的建议,以加快执行速度。

1 个答案:

答案 0 :(得分:2)

如果每个页面都有自己的Map<float, List<Character>>,那么永远不会有多个线程处理单个页面 - 那么您就不需要同步访问Map或使用并发{{1实现。 JB Nizet在评论中建议,您可以在工作者之间对页面进行静态分区;另一种选择是将所有页面放在ConcurrentLinkedQueue中,并让工作人员Map用于解析页面的队列,当队列为空时终止(poll返回poll) 。无论哪种方式,您只需要一个null,因为每个工作人员都负责解析和映射填充。