Vergleich der Verarbeitungszeit basierend auf awk, Shell-Befehl und Java

Über dieses Dokument

Ein Memo, als ich daran beteiligt war, nur bestimmte Spalten in einem bestimmten Unternehmen zu vergleichen und zu eindeutig zu machen. Es wurde versucht, mehrere zehn Millionen Zeilen einer bestimmten Spalte aus einer Datei mit etwa 300 Millionen Zeilen zu entfernen und auszugeben, und es dauerte eine beträchtliche Zeit, sie zu schreiben, indem awk- und shell-Befehle vollständig verwendet wurden, aber das ist Java. Dann ist es eine Geschichte, dass eine hohe Leistung ohne Schwierigkeiten mit geringem Aufwand erreicht werden kann.

Der Quellcode hat Gist am Ende der Seite.

Implementierungsdetails und Vergleichsergebnisse

Zusammenfassend war Java der schnellste und langsamste der von mir geschriebenen Prozesse, bei denen awk stark genutzt wurde.

Wie bereits geschrieben, liest der ausgeführte Prozess eine Datei mit ungefähr 300 Millionen Zeilen und entfernt Duplikate in der ersten und zweiten Spalte, und die Gesamtzahl der Spalten beträgt ungefähr 20. Die Sortierung wurde bereits durchgeführt, und wenn es Duplikate gibt, spielt es keine Rolle, ob Sie die erste oder die zweite gewinnen. Die Bedingung ist also, dass die erste und die zweite Spalte immer eindeutig sind. Übrigens gibt es ungefähr 40 Millionen doppelte Zeilen, aber die Anzahl der doppelten Zeilen ist nicht unbedingt eine, und es kann mehrere Zeilen mit derselben ersten und zweiten Spalte geben.

Unter dieser Bedingung kann die eindeutige Verarbeitung des Befehls sort und des Befehls uniq keine Zeilen eindeutig machen, die dieselben Werte in der ersten und zweiten Spalte, aber unterschiedliche Werte in der n-ten Spalte haben (kann mit sort -k 1,2 -u realisiert werden). Da es eine Möglichkeit gibt, diese jedoch nicht überprüft wurde, haben wir beschlossen, eine bestimmte Spalte mit awk zu extrahieren und auf Duplizierung zu prüfen, indem wir den Wert dieser Spalte mit dem vorherigen Wert vergleichen.

Der, den ich am Anfang geschrieben habe, ist derjenige, der verarbeitet, wenn mit awk. unique.sh

Dieser Prozess betrug etwa 120-150 Linien / s. Ursprünglich wurde gesagt, dass es bei dieser Geschwindigkeit Dutzende von Tagen dauern würde, egal wie lange es dauerte, also habe ich die Situation einige Minuten lang betrachtet und über Effizienz nachgedacht.

Infolgedessen ist die Verwendung von awk wie folgt auf die spezifische Säulenextraktion beschränkt. unique_hs.sh

In diesem Prozess wurden der Vergleichsprozess und der Exportteil nicht über awk erstellt, um den Prozess zu beschleunigen. Tatsächlich war es sicherlich etwas schneller, was zu Geschwindigkeiten von etwa 170 bis 200 Linien / s führte.

Selbst dies ist jedoch eine Berechnung, die ungefähr 20 Tage dauert. Daher ist es auch möglich, die Datei zu teilen und nur die Duplizierung von Anfang und Ende jeder geteilten Datei separat zu behandeln und parallel zu verarbeiten.

In Anbetracht des Grundes, warum es in erster Linie langsam ist, ist es jedoch einfach, dieselbe Verarbeitung mit Java zu puffern und zu schreiben, da beurteilt wird, dass die Leistung aufgrund detaillierter E / A nicht erreicht wird. Schreiben. FilePrinter.java

Das Ergebnis ist klar. Die Geschwindigkeit betrug 185.000 bis 190.000 Linien / s, und der Vorgang war in weniger als 30 Minuten abgeschlossen.

Das Folgende zeigt die Geschwindigkeit jedes Prozesses. (Ich wollte es nur zeigen. Es ist zu überwältigend, um eine vergleichbare Zahl zu machen.)

awkcompare.jpg

Shell-Skripte (und awk) eignen sich gut für die einfache und kleine Verarbeitung. Wenn Sie jedoch mit einer großen Datenmenge arbeiten, ist es eine gute Gelegenheit zu erfahren, dass die Verarbeitungsbeschreibung entsprechend geändert oder das zu verwendende Tool geändert werden muss. Es war eine Geschichte, die wurde.

Klicken Sie hier für Gist: verschiedene Zeilen mit Spalte 1 und 2. · GitHub

Recommended Posts

Vergleich der Verarbeitungszeit basierend auf awk, Shell-Befehl und Java
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
[Java] Vergleich von Zeichenketten und && und ||
Äquivalenter Vergleich von Java-Wrapper-Klasse und primitivem Typ
[Java] Vergleichsmethode für Zeichenketten und Vergleichsmethode mit regulären Ausdrücken
Vor- und Nachteile von Java
Zusammenfassung der Java-Fehlerverarbeitung
Vergleich der WEB-Anwendungsentwicklung mit Rails und Java Servlet + JSP
[Java] Geschwindigkeitsvergleich der Zeichenfolgenkombination
Über Biocontainer fastqc und Java
[Java] Schleifenverarbeitung und Tabelle von neunundneunzig
OpenJDK 8 Java- und Javac-Befehlshilfe
Führen Sie das Shell-Skript von tomcat auf java8 aus
Aktivieren Sie Java 8- und Java 11-SDKs unter Ubuntu
Grundlegender Verarbeitungsablauf von Java Stream
[Java] Korrekter Vergleich des String-Typs
Hinweise zum Java-Pfad und -Paket
Installieren Sie Java 9 unter Windows 10 und CentOS 7
[Java] Ausnahmetypen und grundlegende Verarbeitung
Vergleich der Verarbeitungsgeschwindigkeit zwischen Stream einschließlich Cast und Extended for Statement
Vergleich der Thread-Implementierungsmethoden in Java und der Lambda-Ausdrucksmethode
[Java] Beachten Sie, wie Sie RecyclerView verwenden und die animierte Swipe-Verarbeitung implementieren.
Vergleich der Implementierung der Produktion, die Bilder auf iOS und Android zum Leuchten bringt