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

时间:2010-08-27 13:20:00

标签: java file io

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

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

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

最好的问候

6 个答案:

答案 0 :(得分:3)

我会检查Grep NIO Example作为起点。

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

如果文件非常大并且你想要整体处理它(不仅仅是grep它,或者进行逐行处理),那么存在RAM内存耗尽的风险(或者至少会导致你的记忆弄得一团糟。

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

由于您使用磁盘,因此会降低处理速度,但无论文件大小如何,它都会确保性能级别保持不变。

答案 3 :(得分:1)

Hadoop对此非常有用:http://hadoop.apache.org/ - 它将处理线程,分发到不同的机器,在文本输入周围有很多功能等等.map-reduce范例有点不同,但绝对可以考虑此

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

相关问题