我正在尝试计算 Ubuntu 下一个非常大的文件夹中所有文件的行数。
这些文件是 .gz 文件,我使用
zcat * | wc -l
计算所有文件中的所有行,而且很慢!
我想使用多核计算来完成这项任务并发现this https://www.gnu.org/software/parallel/man.html#EXAMPLE:-Count-the-differences-between-all-files-in-a-dir关于 Gnu 并行,
我尝试使用这个 bash 命令:
parallel zcat * | parallel --pipe wc -l
并且核心并没有全部工作
我发现作业启动可能会导致重大开销,并尝试使用批处理
parallel -X zcat * | parallel --pipe -X wc -l
没有改进,
我如何使用所有核心来计算文件夹中所有文件的行数,因为它们都是 .gz 文件,并且需要在计算行数之前解压缩(之后不需要保持它们未压缩)
谢谢!
如果您有 150,000 个文件,您可能会遇到以下问题“参数列表太长”。你可以这样避免这种情况:
find . -name \*gz -maxdepth 1 -print0 | parallel -0 ...
如果您想要行数旁边的名称,则必须echo
是你自己,因为你的wc
进程只会从其读取stdin
并且不知道文件名:
find ... | parallel -0 'echo {} $(zcat {} | wc -l)'
接下来,我们讨论效率,这取决于您的磁盘的功能。也许尝试与parallel -j2
then parallel -j4
并查看哪些内容适用于您的系统。
正如 Ole 在评论中指出的那样,您可以避免输出正在计算行数的文件的名称,方法是使用GNU 并行's --tag
标记输出行的选项,因此效率更高:
find ... | parallel -0 --tag 'zcat {} | wc -l'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)