我想并行化哈希计算过程,因为我有大量的文件数量和大小。当我看到这些命令的 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
告诉 xargs 仅使用一个参数运行每项作业。虽然 1 个作业对于可以在命令行上处理多个文件名而言并不是最佳选择openssl dgst
,但您几乎总是希望将-n
(或-L
) 选项与xargs -P
.否则,它会尝试将尽可能多的参数放入每个命令行中 - 通常只会导致一项工作,除非您有数以万计的参数。在 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。也许还有其他一些版本。