Wie man in Java 8 alle Zeilen einer Datei parallel liest

Ich möchte alle Zeilen einer 1 GB großen Datei so schnell wie möglich in ein @ einleseStream<String>. Zur Zeit benutze ichFiles(path).lines() dafür. Nach dem Parsen der Datei führe ich einige Berechnungen durch map()/filter()) Zuerst dachte ich, dass dies bereits parallel gemacht wird, aber es scheint, dass ich falsch liege: Wenn ich die Datei so lese, wie sie ist, dauert es auf meinem Dual-CPU-Laptop ungefähr 50 Sekunden. Wenn ich die Datei jedoch mit Bash-Befehlen aufteile und sie dann parallel verarbeite, dauert es nur etwa 30 Sekunden.

Ich habe die folgenden Kombinationen ausprobiert:

Einzelne Datei, keine parallelen Linien () Stream ~ 50 Sekundeneinzelne Datei,Files(..).lines().parallel().[...] ~ 50 Sekundenzwei Dateien, keine parallelen Linien () ~ 30 Sekundenzwei Dateien,Files(..).lines().parallel().[...] ~ 30 Sekunden

Ich habe diese 4 Male mit ungefähr den gleichen Ergebnissen ausgeführt (um 1 oder 2 Sekunden). Das[...] ist nur eine Kette aus Map und Filter mit einemtoArray(...) am Ende, um die Auswertung auszulösen.

Die Schlussfolgerung ist, dass es keinen Unterschied bei der Verwendung von @ gilines().parallel(). Da das parallele Lesen von zwei Dateien weniger Zeit in Anspruch nimmt, ergibt sich ein Leistungsgewinn durch das Aufteilen der Datei. Es scheint jedoch, dass die gesamte Datei seriell gelesen wird.

Bearbeiten Ich möchte darauf hinweisen, dass ich eine SSD verwende, damit es praktisch Zeit zum Suchen gibt. Die Datei enthält insgesamt 1658652 (relativ kurze) Zeilen. Das Aufteilen der Datei in Bash dauert ungefähr 1,5 Sekunden:time split -l 829326 file # 829326 = 1658652 / 2 split -l 829326 file 0,14s user 1,41s system 16% cpu 9,560 total

So meine Frage ist, gibt es eine Klasse oder Funktion im Java 8 JDK, die das Lesen aller Zeilen parallelisieren kann, ohne es zuerst teilen zu müssen? Wenn ich zum Beispiel zwei CPU-Kerne habe, sollte der erste Zeilenleser in der ersten Zeile und der zweite in der Zeile @ beginne(totalLines/2)+1.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage