ファイルの数とサイズが大きいので、ハッシュ計算プロセスを並列化したいと思います。このコマンドは1つのスレッドしか使用しないため、CPU使用率を見るとイライラしています。どのように並列化できますか?
sha256sum foo.mp4
OR
openssl -dgst sha256 foo.mp4
答え1
ファイル全体を並列化するには、GNU Parallelを使用できます。
parallel sha256sum ::: *
単一ファイルの並列ハッシュは、Merkleツリーを使用する特定のハッシュ関数を使用して実行できます。b3sum
そのようなツールです。
答え2
答え3
xargs
-P
複数のジョブを並列に実行することを選択できます。 Ole Tangeのプログラムよりも柔軟性がはるかに低下しますparallel
が、ほとんどの単純な並列化作業には十分です。
たとえば、
find . -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
-P 0
xargs にできるだけ多くのタスクを並列に実行するように指示します。たとえば、32スレッドのThreadripper 1950xでは、32のジョブをopenssl
並列に実行します。-n 1
1つの引数だけを使用して、各ジョブを実行するようにxargsに指示します。コマンドラインで処理できる複数のファイル名に対して1つの操作は最適ではありませんが、openssl dgst
ほぼ常に-n
(または-L
)オプションをxargs -P
。それ以外の場合は、各コマンドラインにできるだけ多くの引数を入力しようとします。通常、数万の引数がない場合は、1つのジョブのみが生成されます。 Linuxでは、コマンドラインの長さの制限は通常200万文字(2097152文字)です(確認
getconf ARG_MAX
)。これにより、多くのファイル名が許可されます。最善の方法は、持っているパラメータの数を数え、並列に実行したいジョブの数で割ることです。例えば
t=32 numfiles=$(find .//. -name '*.mp4' | grep -c //) let n=numfiles/t find . -name '*.mp4' -print0 | xargs -0r -n "$n" -P "$t" openssl dgst -sha256
注:-P
xargsの標準POSIXオプションではありません。 GNUまたは* BSD xargsが必要です。たぶん別のバージョンがあるかもしれません。