Ubuntu 终端 - 使用 gnu 并行读取文件夹中所有文件中的行



我正在尝试计算 Ubuntu 下一个非常大的文件夹中所有文件中的行数。

文件是.gz文件,我使用

zcat * | wc -l

计算所有文件中的所有行,而且很慢!

我想使用多核计算来完成此任务并发现这个关于 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然后parallel -j4,看看什么在你的系统上有效。


正如 Ole 在注释中有用地指出的那样,通过使用 GNU Parallel--tag 选项来标记输出行,您可以避免输出正在计算其行的文件的名称,因此这更加有效:

find ... | parallel -0 --tag 'zcat {} | wc -l'

基本上,您正在寻找的命令是:

ls *gz | parallel 'zcat {} | wc -l'

它的作用是:

  • ls *gz列出标准输出上的所有gz文件
  • 通过管道将其输送到parallel
  • 生成带有parallel的子壳
  • 在所述子壳中运行引号内的命令'zcat {} | wc -l'

关于"{}",根据手册:

此替换字符串将替换为从输入源读取的完整行

因此,每条管道并行的线路都会被馈送到zcat。

当然这是基本的,我认为它可以调整,文档和示例可能会有所帮助

相关内容

  • 没有找到相关文章

最新更新