gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:12:03 28 4
gpt4 key购买 nike

我需要知道 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 日志文件获取文本的方法

方法一

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

最佳答案

我认为“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

关于java - 其他应用程序如何在不占用大量内存的情况下处理大型文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18441260/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com