【问题标题】:Ubuntu terminal - using gnu parallel to read lines in all files in folderUbuntu 终端 - 使用 gnu 并行读取文件夹中所有文件中的行
【发布时间】:2017-11-24 06:57:43
【问题描述】:

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

文件是 .gz 文件,我使用

zcat * | wc -l

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

我想为这个任务使用多核计算,发现this 关于 Gnu 并行,

我尝试使用这个 bash 命令:

parallel zcat * | parallel --pipe wc -l

并且核心并非全部工作 我发现作业开始可能会导致大量开销,并尝试使用

进行批处理
parallel -X zcat * | parallel --pipe -X wc -l

没有改进,

我如何使用所有内核来计算文件夹中所有文件中的行数,因为它们都是 .gz 文件,并且需要在计算行数之前解压缩(之后不需要保持未压缩)

谢谢!

【问题讨论】:

  • 我对并行不太了解,虽然从这个链接drjohnstechtalk.com/blog/2011/06/…,你应该使用更像l ls *gz|time parallel -k "zcat {}" | wc -l的命令
  • 谢谢。似乎更好地利用了核心,需要检查结果,你能解释一下语法并创建一个答案吗?
  • 基本上parallel 需要输入,因此您列出文件,将其通过管道传输到并行,请求并行以保持顺序,在这种情况下可能不需要 (-k),使用并行zcat 在列表"zcat {}" 的一行上,然后将整个传输到wc。顺便说一句,上面的命令有错别字,time 命令应该被删除。如果没有人超过我,我今晚会写一个更明确的答案(经过我这边的一些测试)!
  • 谢谢!等待它。
  • 现在完成了测试,它给出了所有文件中的总行数,这不是我需要的,我需要每个文件中的行数列表,我根据你回答并使用 ls dest/* |time parallel -k "zcat {} | wc -l"

标签: multithreading bash ubuntu parallel-processing gnu-parallel


【解决方案1】:

如果您有 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 在 cmets 中有用地指出的那样,您可以通过使用 GNU Parallel--tag 选项标记输出行来避免输出正在计算行数的文件的名称,所以效率更高:

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

【讨论】:

  • 还要看--tag。
【解决方案2】:

基本上你要找的命令是:

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

它的作用是:

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

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

这个替换字符串将被从输入源读取的整行替换

因此,通过管道连接到并行的每条线都被馈送到 zcat。

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

【讨论】:

    猜你喜欢
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2020-01-16
    • 2021-01-08
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多