Wie das schnelle durchsuchen einer großen Datei nach einem String in Java?

Ich bin versucht, suchen eine große text-Datei (400MB) für eine bestimmte Zeichenfolge mit dem folgenden:

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);
}

Dies funktioniert gut für kleine Dateien, aber für diese bestimmte Datei und anderen großen dauert es viel zu lange (>10 min).

Was wäre die Schnellste, effizienteste Weg, dies zu tun?

Habe ich jetzt wie folgt geändert und vervollständigt es innerhalb von Sekunden -

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);
    }
  • Vergleichen Sie die Geschwindigkeit zu grep -c particularString fileName.txt.
  • Ist es nicht gehen, schneller zu sein, wenn er zuerst liest die gesamte Datei in den Speicher?
  • Eine sehr triviale Sache, die nichts mit Ihrer Datei den Zugriff auf die Methodik ist die System.out.println Aufruf: wenn Sie eine große Anzahl von spielen, es wird tatsächlich verlangsamen Ihre Ausführung, wie Sie erstellen und drucken einer neuen String jeder Zeit. Natürlich, dies ist nicht die eigentliche Optimierung, die Sie suchen, hier.
  • Möglich, Duplikat der what die Schnellste Möglichkeit zu Scannen, eine sehr große Datei, die in java?
  • Was ist die Zeit ohne Druck? Wenn immer noch schlechte Leistung, die Sie könnten versuchen BufferedReader().lines().forEach(..) zu parallelisieren, das zu Lesen. vielleicht.
  • Parallelisieren Sie das Lesen? Würden Sie nicht eingeschränkt werden durch disk-IO?
  • Hat die Datei eigentlich Linien?
  • Die meisten offensichtlich zu beschleunigen, verwenden Sie KEINE Scanner, der sehr langsam im Vergleich zu BufferedReader. Scanner nicht VIEL analysieren.

InformationsquelleAutor Chief DMG | 2016-04-28
Schreibe einen Kommentar