我正在尝试使用以下方法在大型文本文件(400MB)中搜索特定的字符串:
File file = new File("fileName.txt");
try {
int count = 0;
Scanner scanner = new Scanner(file);
while(scanner.hasNextLine()) {
if(scanner.nextLine().contains("particularString")) {
count++;
System.out.println("Number of instances of String: " + count);
}
}
} catch (FileNotFoundException e){
System.out.println(e);
}
这对于小文件来说效果很好,但是对于此特定文件和其他大文件来说,它花费的时间太长(> 10分钟)。
最快,最有效的方法是什么?
我现在已更改为以下内容,并且可以在几秒钟内完成-
try {
int count = 0;
FileReader fileIn = new FileReader(file);
BufferedReader reader = new BufferedReader(fileIn);
String line;
while((line = reader.readLine()) != null) {
if((line.contains("particularString"))) {
count++;
System.out.println("Number of instances of String " + count);
}
}
}catch (IOException e){
System.out.println(e);
}
第一个计算出您实际读取整个文件内容需要花费多长时间以及扫描它们以查找您的模式需要花费多长时间。
如果您的结果受读取时间的支配(并且假设您正确地读取了它,那么通道或至少是缓冲的读取器)就没有什么可做的。
如果扫描时间占主导地位,则您可以读取所有行,然后将要搜索的少量行发送到工作队列中,在那里您可以有多个线程来拾取行批次并在其中进行搜索。
球场数字
鉴于这两个估计,我认为适当的实现可以很容易地使您的运行时间达到10秒左右(如果您在读取行批次时开始启动搜索作业),并且在很大程度上由磁盘读取时间决定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句