Heim > Java > javaLernprogramm > Wie kann ich Zeilen in großen Java-Datendateien effizient zählen?

Wie kann ich Zeilen in großen Java-Datendateien effizient zählen?

Patricia Arquette
Freigeben: 2024-12-09 09:18:07
Original
302 Leute haben es durchsucht

How Can I Efficiently Count Lines in Large Java Data Files?

Zählen von Zeilen in großen Datendateien in Java

Das Zählen der Anzahl von Zeilen in riesigen Datendateien kann eine entmutigende Aufgabe sein. Das zeilenweise Durchlaufen der Datei ist zwar ein gängiger Ansatz, aber zeitaufwändig und ineffizient.

Eine effizientere Alternative ist die Verwendung der folgenden optimierten Methode:

public static int countLines(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];
        int count = 0;
        int readChars = 0;
        boolean empty = true;
        while ((readChars = is.read(c)) != -1) {
            empty = false;
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
        }
        return (count == 0 && !empty) ? 1 : count;
    } finally {
        is.close();
    }
}

public static int countLinesNew(String filename) throws IOException {
    InputStream is = new BufferedInputStream(new FileInputStream(filename));
    try {
        byte[] c = new byte[1024];

        int readChars = is.read(c);
        if (readChars == -1) {
            // bail out if nothing to read
            return 0;
        }

        // make it easy for the optimizer to tune this loop
        int count = 0;
        while (readChars == 1024) {
            for (int i = 0; i < 1024;) {
                if (c[i++] == '\n') {
                    ++count;
                }
            }
            readChars = is.read(c);
        }

        // count remaining characters
        while (readChars != -1) {
            for (int i = 0; i < readChars; ++i) {
                if (c[i] == '\n') {
                    ++count;
                }
            }
            readChars = is.read(c);
        }

        return count == 0 ? 1 : count;
    } finally {
        is.close();
    }
}
Nach dem Login kopieren

Diese Methode liest die Datei in Blöcken von 1024 Bytes, wodurch die Anzahl der Dateisystemzugriffe im Vergleich zum zeilenweisen Lesen erheblich reduziert wird. Es verwaltet die Anzahl der in jedem Block gefundenen Zeilen und akkumuliert die Gesamtzahl.

Benchmarks haben gezeigt, dass diese Methode deutlich schneller ist als die Verwendung von LineNumberReader. Bei einer 1,3-GB-Textdatei benötigt die optimierte Methode etwa 0,35 Sekunden zum Zählen der Zeilen, während LineNumberReader etwa 2,40 Sekunden benötigt.

Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen in großen Java-Datendateien effizient zählen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage