0

我需要知道像 Bairtail 或 Baregrep 这样的应用程序如何处理如此大的文本文件而不会占用大量空间?

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

在 ListView 中查看 JavaFX 中的大型日志文件

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

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

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

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


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

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


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

方法一

 @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();
    } 
}

方法二

 @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();
    }
}
4

2 回答 2

1

我认为“MemoryMappedFile”是您正在寻找的。

我找到了一些链接来帮助你: http ://www.linuxtopia.org/online_books/programming_books/thinking_in_java/TIJ314_029.htm http://javarevisited.blogspot.de/2012/01/memorymapped-file-and-io-in -java.html

于 2013-08-26T09:57:42.987 回答
0

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

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

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

于 2013-08-26T09:50:00.007 回答