Bash 管道太多会影响性能吗
我使用bash命令搜索文件并在本地系统上执行md5dsum。在我看来,这个命令在大型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时,可能需要
供应商
目录上的性能很差。是否有更好的样式,而不是使用性能更高的管道
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
处理大文件可能需要一些时间。如果有许多文件或文件很大,您可能希望使用GNUparallel
而不是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
。文件名中的换行符会破坏它。-如果文件名中有换行符,则可能会遇到更大的问题。