其他应用程序如何在没有大内存占用的情况下处理大型文本文件?

时间:2013-08-26 09:48:22

标签: java parsing java-7 large-files

我需要知道像Bairtail或Baregrep这样的应用程序如何处理如此庞大的文本文件而没有庞大的足迹?

我正在尝试用Java做类似的事情:

Viewing large log files in JavaFX in a ListView

但是当我处理大型文本日志文件(900Mb到2.5Gb的文本)时,我遇到了问题。当我读取文本文件时,JVM内存大小会急剧增加。

另一种方法是只检索我感兴趣的行。但我不知道有任何技术可以在java中执行此操作。我必须逐行开始阅读,直到我到达我想要的所需行(让我们说第1000行),然后抓住那个文本。但是这样做我在内存中有999行等待GC。

例如,Bairgrep正在扫描文件夹中的多个文件并查找模式。如果我打开任务管理器,我几乎看不到内存占用增长。这些程序使用什么类型的技术或扫描方式。

我是否有可以在我的应用程序中使用的技术来处理大型文本文件?


我可能会补充一点,我的日志文件是由java应用程序生成的文件,每行的长度不一样。

一次纠正......内存占用我的意思是我无法在内存中读取6Gb文件。如果我将-Xmx的VM大小指定为小,则为事件。读取6Gb文件时,应用程序内存不足。


添加了两种尝试从758 Mb日志文件中获取文本的方法

方法1

 @FXML
private void handleButtonAction(ActionEvent event) {
    final String fileName = "D:/Development/Logs/File1.log";
    try {
        BufferedReader in = new BufferedReader(new FileReader(fileName));
        while (in.ready()) {
            String s = in.readLine();
        }
        in.close();
    } catch (Exception e) {
        e.printStackTrace();
    } 
}

方法2

 @FXML
private void handleButtonAction(ActionEvent event) {
    final String fileName = "D:/Development/Logs/File1.log";        
    Scanner scan = null;
    try {            
        File file = new File(fileName);

        if (!file.exists()) {
            return;
        }
        scan = new Scanner(file);
        long start = System.nanoTime();
        while (scan.hasNextLine()) {
            final String line = scan.nextLine();                     
        }            
    } catch (Exception e) {
        e.printStackTrace();            
    } finally {
        scan.close();
    }
}

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

您提到的两个应用程序都可能“处理”大文件,但实际上并不需要将整个文件加载到内存中。第一个听起来像是可能直接寻找到文件的末尾,而第二个则是逐行操作。

他们可能通过JNI使用本机代码来实现低内存使用。

编辑:事实上,他们看起来纯粹是C或C ++应用程序,他们不需要等待像Java应用程序那样的GC