代码之家  ›  专栏  ›  技术社区  ›  idiotgenius

用Java读取和处理大文本文件?[关闭]

  •  0
  • idiotgenius  · 技术社区  · 14 年前

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

    有没有什么框架可以帮助完成这项工作?

    文件是100M+,我应该使用多线程吗?

    最好的问候

    6 回复  |  直到 11 年前
        1
  •  3
  •   Gangadhar    14 年前

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

    一个可扩展的解决方案是,您可以一行一行地读取文件,只保留您想要的数据,最后只处理这些数据(假设您可以进行离线处理)。小鲍比表的方法是一个很好的方法,因为它给你一个恒定的处理时间(实际上是O(N),其中N是要处理的行数)。

        2
  •  3
  •   stacker    14 年前

    我会查一下 Grep NIO Example 作为起点。

        3
  •  2
  •   Little Bobby Tables    14 年前

    如果文件非常大,并且您希望将其作为一个整体进行处理(而不仅仅是grep文件,或者进行逐行处理),那么就有可能耗尽RAM内存(或者至少会导致内存混乱)。

    一个更健壮的解决方案是按行分析文件,将其存储到磁盘上的一些随机访问应用程序(数据库)中,然后使用该应用程序进行处理。

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

        4
  •  1
  •   nojo    14 年前

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

        5
  •  1
  •   Anthony    14 年前

    我最近写了一个日志分析器,有300m以上的日志文件。 我使用Apache Commons IO LineIterator 表现良好的班级(20秒)

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

        6
  •  0
  •   Thorbjørn Ravn Andersen    14 年前

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