我必须解决一个接近解析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)和2)上,我想用一种多线程的方式来分隔顺序模式,例如:
2.1解析html并提取文本内容。
2.2将文本内容保存在文件中。
所以我有一个疑问。
令我感到疑惑的是……第一点,我不知道该如何解决。对于第2点,我认为我可以实现诸如解析文件的类的内部类之类的线程,因此我可以使已完成的所有线程都增加一个静态计数器。对于第3点,我认为这与第2点类似,但我不知道如何等待我的应用程序...。
有人可以提出建议解决我的疑问吗??
谢谢 :)
最佳答案
如果您有一个体面,高效的解析器,它应该能够以您可以读取的最快速度解析数据。我建议您仔细检查以确保是这种情况,并且您将能够使用一个线程(可能需要一个单独的线程来进行阅读)
3 GB不是很大。您应该可以在一分钟内阅读/解析它。大部分时间只是从磁盘读取文件。代价很可能就是您对解析的信息所做的工作,这将值得传递给一个或多个其他线程。
要在两个线程(一个用于读取,一个用于处理)之间链接数据,可以使用Exchanger或PipedOutputStream/PipedInputStream。交换器效率更高,但管道流更易于与解析器集成。
关于java - Java方式的生产者/消费者模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4534712/