我必须解决一个接近解析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”中,我遇到了一个有趣的解决方案。所以我想过要像多线程一样实现我的应用程序解析器:
  • 在strinbUilder中收集带有标签的文本上下文,直到之后,我返回Stringbuilder。
  • 返回Stringbuilder之后,我通过CSS规则提取html页面的文本内容。我通过html解析器JSOUP http://jsoup.org/获得了该代码。提取html页面的内容后,我必须将该内容保存在文件中。

  • 所以..把我的注意力放在步骤1)和2)上,我想用一种多线程的方式来分隔顺序模式,例如:
  • 读取文件的一部分(逐行,直到从..到获取)之后,我将该行附加到Stringbuilder。
  • 对于StringBuilder,我创建了一个支持以下代码的线程:
    2.1解析html并提取文本内容。
    2.2将文本内容保存在文件中。

  • 所以我有一个疑问。
  • 我必须创建多少个线程?是否可能必须为所有创建的Stringbuilder创建一个线程??它不会带来内存问题吗?
  • 我该如何获取运行良好的确切线程数?
  • 我怎么知道有多少个线程完成了?我必须等待所有线程完成以终止我的工作??

  • 令我感到疑惑的是……第一点,我不知道该如何解决。对于第2点,我认为我可以实现诸如解析文件的类的内部类之类的线程,因此我可以使已完成的所有线程都增加一个静态计数器。对于第3点,我认为这与第2点类似,但我不知道如何等待我的应用程序...。

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

    最佳答案

    如果您有一个体面,高效的解析器,它应该能够以您可以读取的最快速度解析数据。我建议您仔细检查以确保是这种情况,并且您将能够使用一个线程(可能需要一个单独的线程来进行阅读)

    3 GB不是很大。您应该可以在一分钟内阅读/解析它。大部分时间只是从磁盘读取文件。代价很可能就是您对解析的信息所做的工作,这将值得传递给一个或多个其他线程。

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

    关于java - Java方式的生产者/消费者模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4534712/

    10-13 09:53