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

Multithreading Ubuntu终端-使用gnu并行读取文件夹中所有文件的行,multithreading,bash,ubuntu,parallel-processing,gnu-parallel,Multithreading,Bash,Ubuntu,Parallel Processing,Gnu Parallel,我正试图计算Ubuntu下一个非常大的文件夹中所有文件的行数 这些文件是.gz文件,我使用 zcat * | wc -l 数一数所有文件中的所有行,这太慢了 我想使用多核计算来完成这项任务,并发现 关于Gnu并行 我尝试使用此bash命令: parallel zcat * | parallel --pipe wc -l 而且核心部分也不是都在工作 我发现作业启动可能会导致较大的开销,并尝试使用批处理 parallel -X zcat * | parallel --pipe -X wc -l

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

这些文件是.gz文件,我使用

zcat * | wc -l
数一数所有文件中的所有行,这太慢了

我想使用多核计算来完成这项任务,并发现 关于Gnu并行

我尝试使用此bash命令:

parallel zcat * | parallel --pipe wc -l
而且核心部分也不是都在工作 我发现作业启动可能会导致较大的开销,并尝试使用批处理

parallel -X zcat * | parallel --pipe -X wc -l
没有改进

如果所有文件都是.gz文件,并且需要在计算行数之前进行解压缩(不需要在计算行数之后进行解压缩),那么如何使用所有核心来计算文件夹中所有文件中的行数


谢谢

基本上,您要查找的命令是:

ls *gz | parallel 'zcat {} | wc -l'
它所做的是:

  • ls*gz
    列出stdout上的所有gz文件
  • 通过管道将其连接到并行
  • 使用
    并行生成子shell
  • 在上述子shell中运行引号
    'zcat{}wc-l'
关于“{}”,根据手册:

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

因此,每一条并联的管线都被送入zcat


当然,这是基本的,我假设它可以调整,并且示例可能会有所帮助

如果您有150000个文件,您可能会遇到“参数列表太长”的问题。您可以这样避免:

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'

我对并行不太了解,不过通过这个链接,您应该使用更像l
ls*gz|time parallel-k“zcat{}”wc-l的命令,谢谢。似乎更好地利用了内核,需要检查结果,您能解释一下语法并创建一个答案吗?基本上
parallel
需要输入,所以您列出文件,将其传输到parallel,要求parallel保持顺序,在这种情况下可能不需要(
-k
),在列表的一行上使用与zcat并行的方法“zcat{}”
,然后将整个管道连接到
wc
。顺便说一下,上面的命令有输入错误,应该删除
time
命令。如果没有人比我更清楚的话,我今晚会写一个更明确的答案(在我这方面做了一些测试之后)!谢谢现在完成了测试,它给出了所有文件中的总行数,这不是我需要的,我需要每个文件中的行数列表,我根据您的答案获得它,并使用ls dest/*| time parallel-k“zcat{}wc-l”还查看--tag。