用Java读取和处理大文本文件?

我想阅读一个非常大的文本文件(Web应用程序的日志文件)并进行一些处理。

是否有任何框架可以帮助完成此类工作?

该文件是100M +,我应该使用mutil-thread?

最好的祝福

在你的情况下,multithreading无济于事,因为问题是I / O绑定而不是CPU绑定(好吧,除非你试图在内存中对文本文件进行大量处理然后再写回来)。 如果担心的是读取文件,通常100 MB是大型系统可以处理的。 如果这是文件的大小并且您在Unix计算机上运行,​​请查看是否可以在64位VM下运行代码。 当然,这不是一个永久的解决方案。

可扩展的解决方案是让您逐行读取文件并仅保留所需的数据,并最终单独处理该数据(假设您可以进行离线处理)。 Little Bobby Tables的方法很好,因为它给你一个恒定的处理时间(实际上它将是O(n),其中n是要处理的行数)。

我会检查Grep NIO示例作为起点。

如果文件非常大并且你想要整体处理它(不仅仅是grep它,或者进行逐行处理),那么你将面临RAM内存耗尽的风险(至少会导致内存混乱) )。

更强大的解决方案是逐行解析文件,将其存储到某些磁盘随机访问应用程序(数据库),然后使用此应用程序进行处理。

由于您使用磁盘,它将减慢您的处理速度,但无论文件大小如何,它都将确保性能级别保持不变。

Hadoop非常适合这个: http : //hadoop.apache.org/ – 它将处理线程,分发到不同的机器,在文本输入方面有很多function等等.map-reduce范例有点不同,但是绝对考虑这个。

我最近写了一个带有300M +日志文件的日志分析器。 我使用Apache Commons IO LineIterator类,表现很好(20秒)

对于较少的IO,您不需要先解压缩文件,而是使用new InputStreamReader(new GZIPInputStream(new FileInputStream(logFile)), "US-ASCII"); 作为输入阅读器。

根据您的需要,最有效的解决方案可能是启动一个专门用于执行此类工作的外部程序,如perl,grep或awk,然后告诉它要做什么,然后对结果进行后处理。