sha256sumコマンドまたは他のハッシュコマンドを並列化する方法は?

sha256sumコマンドまたは他のハッシュコマンドを並列化する方法は?

ファイルの数とサイズが大きいので、ハッシュ計算プロセスを並列化したいと思います。このコマンドは1つのスレッドしか使用しないため、CPU使用率を見るとイライラしています。どのように並列化できますか?

sha256sum foo.mp4
OR
openssl -dgst sha256 foo.mp4

答え1

ファイル全体を並列化するには、GNU Parallelを使用できます。

parallel sha256sum ::: *

単一ファイルの並列ハッシュは、Merkleツリーを使用する特定のハッシュ関数を使用して実行できます。b3sumそのようなツールです。

答え2

あるいは、最新のIntelまたはAMD CPUなど、ハードウェアSHA256計算をサポートするCPUにアップグレードすることもできます。私のRyzen 3700Xは、はるかに簡単なアルゴリズムであるMD5よりもはるかに速くSHA256ハッシュ合計を計算します。チェックsha_niイン/proc/cpuinfo

またはあなたは使用することができますブレーキ3すごく多いですね(ほぼ15倍)急いで純粋にソフトウェアで実装されていても:

ここに画像の説明を入力してください。

答え3

xargs-P複数のジョブを並列に実行することを選択できます。 Ole Tangeのプログラムよりも柔軟性がはるかに低下しますparallelが、ほとんどの単純な並列化作業には十分です。

たとえば、

find . -name '*.mp4' -print0 | xargs -0r -n 1 -P 0 openssl dgst -sha256
  • -P 0xargs にできるだけ多くのタスクを並列に実行するように指示します。たとえば、32スレッドのThreadripper 1950xでは、32のジョブをopenssl並列に実行します。

  • -n 11つの引数だけを使用して、各ジョブを実行するように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
    

注:-Pxargsの標準POSIXオプションではありません。 GNUまたは* BSD xargsが必要です。たぶん別のバージョンがあるかもしれません。

関連情報