Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 管道太多会影响性能吗_Bash_Shell_Unix - Fatal编程技术网

Bash 管道太多会影响性能吗

Bash 管道太多会影响性能吗,bash,shell,unix,Bash,Shell,Unix,我使用bash命令搜索文件并在本地系统上执行md5dsum。在我看来,这个命令在大型供应商目录上的性能很差。是否有更好的样式,而不是使用性能更高的管道 find ./vendor -type f -print0 | sort -z | xargs -0 md5sum | grep -vf /usr/local/bin/vchecker_ignore > MD5sums sort在这里引入了阻塞:它必须等到find完成后才能输出结果在大型文件系统上查找,尤其是使用hdd或nfs时,可能需要

我使用bash命令搜索文件并在本地系统上执行md5dsum。在我看来,这个命令在大型
供应商
目录上的性能很差。是否有更好的样式,而不是使用性能更高的管道

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

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

您可能希望在最后进行排序,以允许
md5sum
find
并行运行,例如:

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
),对于大文件,您可能喜欢较小的批处理。

我不认为管道成本太高;它们比为每个输入行启动一个进程要好得多。此外,在第一步排除不需要的文件(在vchecker_ignore中列出的文件),而不是先处理它们,然后再扔掉。
它们比为每个输入行启动一个进程要好得多。
。什么意思?在每个输入行上运行sort(例如)有什么意义?我认为你在混合一些东西,管道本身根本没有性能问题。这里唯一的问题是,您要计算文件的校验和,然后再过滤掉这些文件;理想情况下,这将允许在搜索仍在运行时启动哈希计算;一个是磁盘,另一个是CPU,所以这可能是一个真正的好处。也许应该使用
unbuffer
stdbuf
(请参阅)让md5sum立即启动。@PeterA.Schneider Yep,行缓冲
find
进入
并行md5sum
,然后收集、过滤和排序
md5sum
输出。@PeterA.Schneider更多地考虑缓冲,该命令使用0分隔符,因此,行缓冲模式不会影响它。@MaximeGroushkin如果需要,可以使用缓冲区大小为0而不是行缓冲。@hek2mgl我不建议这样使用
xargs
。文件名中的换行符会破坏它。-如果文件名中有换行符,则可能会遇到更大的问题。