【发布时间】:2017-08-15 01:03:15
【问题描述】:
我有很大的文件(每个 4.5 GB),需要计算每个文件中以给定标记开头的行数。每个文件最多可以出现 20 万次令牌。
实现如此庞大的文件遍历和字符串检测的最快方法是什么?有没有比使用Scanner 和String.startsWith() 的以下实现更有效的方法?
public static int countOccurences(File inputFile, String token) throws FileNotFoundException {
int counter = 0;
try (Scanner scanner = new Scanner(inputFile)) {
while (scanner.hasNextLine()) {
if (scanner.nextLine().startsWith(token)) {
counter++;
}
}
}
return counter;
}
注意:
- 到目前为止,
Scanner似乎是瓶颈(即,如果我添加比令牌检测更复杂的处理并将其应用于所有行,则总体执行时间或多或少相同。) - 我使用的是 SSD,所以硬件方面没有改进的余地
提前感谢您的帮助。
【问题讨论】:
-
普通!它不是重复的,您是否阅读过您所指的问题?我说的是有数百万行而不是 20k 的文件,我也在谈论令牌检测。您的“重复”标签仅表明您没有阅读我的问题,也没有阅读您所指的问题。
-
问题已结束,我无法将其作为答案发布,但请看一下
grepdoes that 的方法。它避免使用Boyer–Moore search algorithm 读取每个字节。 -
我也不认为这是重复的。这怎么没有标记?
-
阅读:nadeausoftware.com/articles/2008/02/…。如果你想你可以用 ByteBuffer.allocateDirect 读取大块将节省从文件读取的时间,你可以并行分配数据的过程来搜索你的令牌和换行符
-
grep | wc -l?
标签: java performance file file-io