2010-08-27 62 views
0

我想读一个非常大的文本文件(一个Web应用程序的日志文件)并做一些处理。在Java中读取和处理大文本文件?

有没有任何框架来帮助做这样的工作?

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

问候

+0

可能重复[在Java中读取大文件](http://stackoverflow.com/questions/2356137/read-large-files-in-java) – fglez 2013-04-10 08:58:09

回答

3

在你的情况下,多线程并没有太大的帮助,因为问题是I/O绑定而不是CPU绑定(当然,除非你试图对内存中的文本文件进行大量处理,然后将其写回)。如果关心的是读取文件,通常100 MB是大型系统可以处理的。如果这是文件的大小,并且您在Unix机器上运行,请查看您是否可以在64位虚拟机下运行代码。当然,这不是一个永久的解决方案。

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

+0

谢谢!我学到了很多 – idiotgenius 2010-09-07 13:37:31

2

如果该文件是非常大的,你要处理它作为一个整体(而不仅仅是用grep显示它,或做行明智处理)有你用完了RAM内存的风险(或者至少会导致你的记忆混乱)。

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

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

0

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

1

Hadoop非常适合这个:http://hadoop.apache.org/ - 它可以处理线程,分发到不同的机器,在文本输入等方面有很多功能。map-reduce范例有点不同,但是肯定会考虑这一点。

1

我最近写了一个300M +日志文件的日志分析器。 我使用Apache Commons IO LineIterator类进行罚款(20秒)

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