太多的管道对性能不利

时间:2018-08-22 15:59:39

标签: bash shell unix

我使用该bash命令搜索文件并在本地系统上执行md5dsum。我认为该命令在大型vendor目录上的性能较差。是否有更好的样式而不是在性能更高的管道之后使用管道?

find ./vendor -type f -print0 | sort -z | xargs -0 md5sum | grep -vf /usr/local/bin/vchecker_ignore > MD5sums

1 个答案:

答案 0 :(得分:7)

sort在这里引入了阻塞:它必须等到find完成后才能输出结果。大文件系统上的find,尤其是使用hdd或nfs的文件系统,可能需要一段时间。

您可能想在最后进行排序,以使md5sumfind并行运行,例如:

find ./vendor -type f -print0 | xargs -0 md5sum | grep -vf /usr/local/bin/vchecker_ignore | sort -k2 > MD5sums

md5sum对于大文件可能需要一些时间。如果有很多文件或文件很大,您可能希望使用GNU parallel而不是xargs来运行它。


您可能还喜欢使用行缓冲模式。在这种情况下,它需要对文件名使用换行分隔符(禁止在文件名中使用换行符号,这很不常见),而不是0分隔符才能使行缓冲模式起作用。例如:

stdbuf -oL find ./vendor -type f | stdbuf -oL grep -vf /usr/local/bin/vchecker_ignore | xargs -n50 -d'\n' md5sum | sort -k2 > MD5sums

以上命令将首先通过该grep过滤每个文件,然后对50个文件的批次执行md5sum。对于小文件,您可能需要较大的批次(并且可能会完全stdbuf -oL都删除),对于大文件,则可能较小。