如何在Java中快速在大文件中搜索字符串?

首席DMG:

我正在尝试使用以下方法在大型文本文件(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);
    }
发现:

第一个计算出您实际读取整个文件内容需要花费多长时间以及扫描它们以查找您的模式需要花费多长时间。

如果您的结果受读取时间的支配(并且假设您正确地读取了它,那么通道或至少是缓冲的读取器)就没有什么可做的。

如果扫描时间占主导地位,则您可以读取所有行,然后将要搜索的少量行发送到工作队列中,在那里您可以有多个线程来拾取行批次并在其中进行搜索。

球场数字

  • 假设硬盘读取速度为50 MB /秒(按照现代标准,这是很慢的),您应该能够在不到10秒的时间内将整个文件读取到内存中。
  • 查看MD5散列速度基准(此处示例)可以看出,散列速率至少可以与磁盘读取速度一样快(通常更快)。而且,字符串搜索比哈希算法更快,更简单并且并行化更好。

鉴于这两个估计,我认为适当的实现可以很容易地使您的运行时间达到10秒左右(如果您在读取行批次时开始启动搜索作业),并且在很大程度上由磁盘读取时间决定。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Python-如何在大文件中搜索字符串

如何在java中替换大文件末尾的字符串?

搜索并替换很大文件中的字符串

有效搜索大文件中的字符串

如何在文件中搜索字符串?

如何在文件中搜索字符串?

如何在html文件中搜索字符串?

C如何在文件中搜索字符串?

如何在 .gz 文件中搜索字符串?

如何在Eclipse中搜索Java字符串?

如何在字符串中搜索字符串?

Java:在大型词典中搜索字符串的快速方法

如何在搜索字符串中搜索任何字符?

如何在文件中搜索字符串,而文件又在归档文件中?

(快速)如何在字符串中打印“ \”字符?

如何快速从大文件中搜索列表内容?

如何在 BASH 脚本中读取 .ini 文件以搜索文件中的字符串?

如何在jsp文件中打印Java字符串

使用python搜索大文件中的字符串的更快方法

如何在多个文件中搜索特定字符串,并返回包含该字符串的所有文件的名称?

在文件中搜索字符或字符串(java)

如何在Android Studio中的所有文件中搜索字符串?

如何在Word字段中的字符串中搜索多个DOCX文件?

如何从Haskell中的文件/字符串中搜索模式

如何在SQL中搜索字符串中的字母

如何在也有zip文件的文件夹中搜索字符串

如何在字符串中搜索子字符串,直到在Java中指定字符为止?

如何根据列中的子字符串仅保存大文件中的重复行?

将标头记录(或字符串/文件)添加到 Scala/Java 中的大文件