it-swarm.com.de

Wie verwende ich GNU parallel, um sha256-Hash zu berechnen?

Basierend darauf: Mehrere Digests gleichzeitig berechnen (md5, sha256)?

Ich habe einen Ordner mit einer großen Anzahl von Dateien, für die ich den SHA256-Hash berechnen möchte.

Ich habe früher Segmente codiert:

#!/bin/bash
for file in *; do
sha256sum "$file" > "$file".sha &
done

derzeit wird der sha256-Hash parallel berechnet, außer dass mein Computer nur 16 physische Kerne hat.

Die Frage, die ich habe, ist also, wie ich GNU parallel) verwenden kann, um dies auszuführen, aber nur mit den 16 physischen Kernen, die ich auf meinem System verfügbar habe und die nach Abschluss eines Hashs ausgeführt werden wird automatisch die nächste zu hashende Datei aufgenommen?

8
alpha754293

Verwenden von xargs (und vorausgesetzt, Sie haben eine Implementierung dieses Dienstprogramms, die -0 Und -P Unterstützt):

printf '%s\0' * | xargs -0 -L 1 -P 16 sh -c 'sha256sum "$1" > "$1".sha' sh

Dies würde alle Namen im aktuellen Verzeichnis als nicht terminierte Liste an xargs übergeben. Das Dienstprogramm xargs ruft für jeden dieser Namen ein Inline-Skript sh auf, beginnend mit höchstens 16 gleichzeitigen Prozessen. Das Inline-Skript nimmt das Argument und führt sha256sum Darauf aus, wobei das Ergebnis in eine Datei mit einem ähnlichen Namen ausgegeben wird.

Beachten Sie, dass dies möglicherweise auch .sha - Dateien aufnimmt, die in einem vorherigen Lauf derselben Pipeline erstellt wurden. Um dies zu vermeiden, verwenden Sie einen etwas komplexeren Glob als *, Um den bestimmten Namen zu entsprechen, die Sie verarbeiten möchten. Zum Beispiel in bash:

shopt -s extglob
printf '%s\0' !(*.sha) | xargs ...as above...

Beachten Sie auch, dass das parallele Ausführen von sha256sum Für große Dateien wahrscheinlich eher festplattengebunden als CPU-gebunden ist und dass Sie möglicherweise eine ähnliche Betriebsgeschwindigkeit bei einer geringeren Anzahl paralleler Tasks feststellen.


Ersetzen Sie für ein GNU parallel Äquivalent xargs durch parallel.


In der zsh Shell können Sie dies wie folgt tun

autoload -U zargs
setopt EXTENDED_GLOB

zargs -P 16 -L 1 -- (^(*.sha)) -- sh -c 'sha256sum "$1" > "$1".sha' sh
8
Kusalananda

Mit GNU parallel können Sie die Shell-Schleife vollständig vermeiden und einfach ausführen:

parallel -P 16 sha256sum {} ">"{}.sha ::: *

Das läuft sha256sum für jede Datei (oder jedes Verzeichnis, aber genau das hat Ihr Skript getan) vom Glob zurückgegeben * und speichern Sie die Ausgabe in fileName.sha. Zum Beispiel:

$ ls
file1  file2  file3  file4  file5
$ parallel -P 16 sha256sum {} ">"{}.sha ::: *
$ ls
file1      file2      file3      file4      file5
file1.sha  file2.sha  file3.sha  file4.sha  file5.sha

Bedenken Sie jedoch, was @Kusalandanda darauf hingewiesen über den Hauptengpass bei solchen Dingen wie der E/A und nicht unbedingt der CPU ist. Möglicherweise möchten Sie weniger als 16 parallel ausführen.

6
terdon