Ihr begrenzender Geschwindigkeitsfaktor ist die E / A-Geschwindigkeit Ihres Speichergeräts. Ein Wechsel zwischen einfachen Zeilenumbrüchen / Musterzählprogrammen hilft daher nicht weiter, da der Unterschied in der Ausführungsgeschwindigkeit zwischen diesen Programmen wahrscheinlich durch die Art und Weise unterdrückt wird, in der die Festplatte / der Speicher langsamer ist. was auch immer du hast.
Wenn Sie jedoch dieselbe Datei auf Festplatten / Geräte kopiert haben oder die Datei auf diese Festplatten verteilt ist, können Sie den Vorgang auf jeden Fall parallel ausführen. Ich weiß nicht genau über diesen Hadoop Bescheid, aber vorausgesetzt, Sie können die Datei mit 10 GB von 4 verschiedenen Speicherorten aus lesen, können Sie 4 verschiedene Zeilenzählprozesse ausführen, jeder in einem Teil der Datei, und ihre Ergebnisse zusammenfassen:
$ dd bs=4k count=655360 if=/path/to/copy/on/disk/1/file | wc -l &
$ dd bs=4k skip=655360 count=655360 if=/path/to/copy/on/disk/2/file | wc -l &
$ dd bs=4k skip=1310720 count=655360 if=/path/to/copy/on/disk/3/file | wc -l &
$ dd bs=4k skip=1966080 if=/path/to/copy/on/disk/4/file | wc -l &
Beachten Sie das &
an jeder Befehlszeile, damit alle parallel ausgeführt werden. dd
funktioniert wie cat
hier, aber lassen Sie uns angeben, wie viele Bytes gelesen werden sollen ( count * bs
Bytes) und wie viele am Anfang der Eingabe skip * bs
übersprungen werden sollen ( Bytes). Es funktioniert in Blöcken, daher muss angegeben werdenbs
die Blockgröße angegeben werden. In diesem Beispiel habe ich die 10-GB-Datei in 4 gleiche Blöcke von 4 KB * 655360 = 2684354560 Byte = 2,5 GB partitioniert, eine für jeden Auftrag. Möglicherweise möchten Sie ein Skript einrichten, das dies basierend auf der Größe der Datei für Sie erledigt Datei und die Anzahl der parallelen Jobs, die Sie ausführen werden. Sie müssen auch das Ergebnis der Ausführungen zusammenfassen, was ich wegen meines Mangels an Shell-Skript-Fähigkeiten nicht getan habe.
Wenn Ihr Dateisystem intelligent genug ist, um große Dateien auf viele Geräte wie ein RAID oder ein verteiltes Dateisystem oder ähnliches aufzuteilen und E / A-Anforderungen, die parallelisiert werden können, automatisch zu parallelisieren, können Sie eine solche Aufteilung durchführen, indem Sie viele parallele Jobs ausführen, aber verwenden der gleiche Dateipfad, und Sie können immer noch einen gewissen Geschwindigkeitsgewinn haben.
BEARBEITEN: Eine andere Idee, die mir gekommen ist, ist, wenn die Zeilen in der Datei dieselbe Größe haben, können Sie die genaue Anzahl der Zeilen erhalten, indem Sie die Größe der Datei durch die Größe der Zeile dividieren, beide in Bytes. Sie können dies fast augenblicklich in einem einzigen Job tun. Wenn Sie die mittlere Größe haben und sich nicht genau um die Zeilenanzahl kümmern, aber eine Schätzung wünschen, können Sie dieselbe Operation ausführen und ein zufriedenstellendes Ergebnis viel schneller als die exakte Operation erzielen.