热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在Linux命令中使用多个CPU核心

这里有一个普遍的问题:你曾经想要统计一个非常大的列表(上百兆),或者检索文本信息,又或者一些其他无法并行运行的操作。你的CPU可能有4个核

       这里有一个普遍的问题:你曾经想要统计一个非常大的列表(上百兆),或者检索文本信息,又或者一些其他无法并行运行的操作。你的CPU可能有4个核心或者更多,但是我们使用的工具却是像grep、bzip2、wc、awk、sed等命令,这些都只使用单线程和单个CPU核心。

       借用卡通人物Cartman的话,“我该如何才能使用这些内核”?

       这就需要通过使用GNU Parallel,来使用所有的CPU核心。它让我们所有的CPU核心做map-reduce的神奇操作,而且这还要借助很少用到的-pipes参数(也叫做-spreadstdin)。我保证这样你的负载就会均衡地分配到所有核心上。

bzip2

       bzip2比gzip有更好的压缩效果,但它太慢了。放弃折腾吧,我们现在有技术解决这个问题。取代这种使用办法:

cat bigfile.bin | bzip2 --best > compressedfile.bz2      而改为

cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2
     特别对于bzip2命令,GNU Parallel在多核CPU上显著地快于单核。你一不留神,它就执行完成了。
GREP

      如果你有一个超大的文本文件需要被检索,那么就不应该这样使用:

grep pattern bigfile.txt      而是

cat bigfile.txt | parallel --pipe grep 'pattern'
      抑或是

cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'
       第二条命令使用了--block 10M参数,通过这个参数可以表示你希望每个CPU核心处理多少行数据。 AWK

       这里有一个如何使用awk来计算一个非常大的文件的例子,原来我们使用:

cat rands20M.txt | awk '{s+=$1} END {print s}'
       而现在:

cat rands20M.txt | parallel --pipe awk \'{s+=\$1} END {print s}\' | awk '{s+=$1} END {print s}'
       这里面用到了更多的东西。在parallel中的-pipe参数将cat的输出分成多个块传递给awk,形成许多子操作计算,这些子计算结果通过第二个管道传给同一个的awk,然后给出最终结果。第一个awk有三个反斜线,这是为了GNU Parallel调用awk的需要。 WC

       想要使用超级并行来计算一个文件的行数吗?那么就不要再这样使用了:

wc -l bigfile.txt       而是:

cat bigfile.txt | parallel --pipe wc -l | awk '{s+=$1} END {print s}'
       这是一种相当巧妙的方法:我们先映射出大量的wc -l的调用,生成子运算,然后通过第二个管道传给awk,把它们加起来。 SED

       想要使用sed在一个极大的文件中做大量替换么?那么就不应该这样使用:

sed s^old^new^g bigfile.txt
      而是

cat bigfile.txt | parallel --pipe sed s^old^new^g
      ... ... 然后可以使用pipe把输出存储到指定的文件中。


原文地址:http://www.rankfocus.com/use-cpu-cores-linux-commands/


推荐阅读
author-avatar
指尖的烟味让我清醒7758_371
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有