生产者/消费者模式的Java方式

时间:2010-12-26 17:20:40

标签: java multithreading

我必须解决一个接近解析像3 GB或更高版本的巨大文件的问题。好吧,该文件的结构如下:伪xml文件如:

<docFileNo_1>
<otherItems></otherItems>
<html>
<div=XXXpostag>
</html>

</docFileNo>
   ... others doc... 
<docFileNo_N>
<otherItems></otherItems>

<html>
<div=XXXpostag>
</html>

</docFileNo>

.......

在最近的帖子中:“http://stackoverflow.com/questions/4355107/parsing-a-big-big-not-well-formed-file-with-java”,我遇到了一个有趣的解决方案问题..所以我想要实现我的应用程序解析器,如多线程:

  1. 在strinbUilder中收集带有标记的文本上下文,直到&lt; \ html&gt;,我返回Stringbuilder。
  2. 返回Stringbuilder后,我通过CSS规则提取html页面的文本内容。我用一个HTML解析器JSOUP http://jsoup.org/获得了它。在提取了html页面的内容后,我必须将该内容保存在文件中。
  3. 所以..把我的注意力放在步骤1)和2)上,我认为将顺序模式与多线程方式分开:

    1. 在读取文件的一大块(逐行直到从...获取&lt; \ html&gt;)之后,我将该行附加到Stringbuilder。
    2. 对于StringBuilder,我创建了一个支持代码的线程 2.1解析html并提取文本内容。 2.2将文本内容保存在文件中。
    3. 所以我怀疑......

      1. 我必须创建多少个线程?有可能我必须为所有创建的Stringbuilder创建一个线程吗?它没有带来内存问题??
      2. 如何获取运行良好的确切线程数?
      3. 我怎么知道完成了多少线程?我必须等待所有线程都已完成以终止我的工作?
      4. 对于我的怀疑......第1点,我不知道如何真正解决它。对于第2点,我认为我可以实现类似解析文件的类的内部类的线程,因此我可以通过已完成的所有线程增加静态计数器。对于第3点,我认为这是类似的第2点,但我不知道如何等待我的申请....

        有人可以建议解决我的疑惑吗? 谢谢:))

1 个答案:

答案 0 :(得分:1)

如果你有一个体面,高效的解析器,它应该能够尽可能快地解析数据。我建议你看看确保是这种情况,你将能够使用一个线程(可能是一个单独的线程来进行阅读)

3 GB并不是那么大。您应该能够在一分钟内阅读/解析它。大部分时间都只是从磁盘上读取文件。成本很可能是您使用已解析的信息所做的,而且值得传递给一个或多个其他线程。

要在两个线程(一个用于读取,一个用于处理)之间链接数据,您可以使用Exchanger或PipedOutputStream / PipedInputStream。交换机效率更高,但是Piped流更容易与解析器集成。