我需要知道像 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();
}
}