
Ich habe ca. 3000 Dateien mit je 300 MB und möchte diese mit meinem 16-Core-Server möglichst schnell nach einer Reihe von Teilstrings durchsuchen.
Das habe ich versucht, aber die Dateisuche scheint dadurch nicht parallelisiert zu werden.
sudo find /mnt2/preprocessed/preprocessed/mo* | sudo xargs awk '/substring/ {c++} END {print c}' | paste -sd+ | bc
Es ist aus verschiedenen Anleitungen zusammengeklatscht, ich verstehe es nicht ganz. Habt ihr Vorschläge, wie ich die Dateiverarbeitung aufteilen kann?
Antwort1
- Überprüfen Sie, ob Sie das
parallel
Programm auf Ihrem System haben. (Es könnte von GNU stammen.) Wenn ja, finden Sie heraus, wie man es benutzt. Andernfalls - Führen Sie Ihre
find
Ausgabe in eine Datei aus. Teilen Sie diese Datei mithilfe eines Texteditors oder möglicherweise eines Skripts mit Tools wiehead
in 16 Fragmentdateien mit (ungefähr) gleicher Zeilenanzahl auf (d. h., sie verweisen auf die gleiche Anzahl gefundener Dateien). Starten Sie dann 16awk … | paste … | bc
Pipelines; eine für jede Fragmentdatei. (Und fügen Sie die 16 Ergebnisse hinzu.)
awk
Ich frage mich, warum Sie es zum Zählen der Vorkommen einer Zeichenfolge verwenden , wenn grep -c
es speziell dafür entwickelt wurde.
Antwort2
GNU parallel ist ziemlich kompatibel mit xargs, in Ihrem Fall kann es es ersetzen. Wenn Sie nur Vorkommen von substring
use grep -c
als zählenScottschlägt vor:
sudo find /mnt2/preprocessed/preprocessed/mo* |
sudo parallel grep -c source | paste -sd+ | bc
Beachten Sie, dass einige Versionen von GNU/Linux GNU parallel im kompatiblen Modus „Tollefs parallel“ installieren. Sie können das ändern, indem Sie --gnu
den Befehlszeilenargumenten parallel hinzufügen. Um die Änderung dauerhaft zu machen, fügen Sie --gnu
zu hinzu ~/.parallel/config
.