我需要知道像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();
}
}
答案 0 :(得分:1)
我认为“MemoryMappedFile”正是您所寻找的。 p>
我找到了一些帮助你的链接: 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
答案 1 :(得分:0)
您提到的两个应用程序都可能“处理”大文件,但实际上并不需要将整个文件加载到内存中。第一个听起来像是可能直接寻找到文件的末尾,而第二个则是逐行操作。
他们可能通过JNI使用本机代码来实现低内存使用。
编辑:事实上,他们看起来纯粹是C或C ++应用程序,他们不需要等待像Java应用程序那样的GC 。