我使用Scanner读取许多日志文件(~100个文件),每个日志文件大约120mb,并且有超过1,000,000行。用于读取日志文件的内存不断增加并导致内存过载。如何防止这种情况发生?这是我的代码:
File file = processing.poll(); // processing is a queue.
Scanner sc = new Scanner(file);
String line;
int lineCount = 0;
while (sc.hasNextLine()) {
line = sc.nextLine();
}
sc.close();
谢谢!!
P / S:内存增加缓慢,每处理一个文件大约1mb,但我会将此代码推送到服务器,并且将来会有无数文件。
答案 0 :(得分:2)
我建议您使用try-with-resources
close
Scanner
并释放文件句柄。此外,您可以限制line
的范围,我认为您的意思是增加lineCount
。像,
int lineCount = 0;
try (Scanner sc = new Scanner(file)) {
while (sc.hasNextLine()) {
String line = sc.nextLine();
lineCount++;
}
}
或者,您可以使用像
这样的finally
块
int lineCount = 0;
Scanner sc = new Scanner(file);
try {
while (sc.hasNextLine()) {
String line = sc.nextLine();
lineCount++;
}
} finally {
sc.close();
}
答案 1 :(得分:0)
问题是你正在将所有这些巨大的~100个日志文件加载到内存中。想一想。 ~100个日志文件,每个约120mb。这是一个很大的记忆!您将不得不在单个日志文件中读取,处理它,然后释放文件上的句柄并将其从内存中删除,然后重复,直到所有日志都按照您希望的方式处理。您需要一种算法来分别处理它们并根据需要释放句柄/内存以避免过载。