如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等

oschina
 oschina
发布于 2013年10月30日
收藏 452

你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grepbzip2wcawksed等等,都是单线程的,只能使用一个CPU内核。

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

要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。

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参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。

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}'

非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l调用,形成子计算,最后通过管道发送给awk进行汇总。

SED

想在一个巨大的文件里使用sed命令做大量的替换操作吗?

常规做法:

sed s^old^new^g bigfile.txt

现在你可以:

cat bigfile.txt | parallel --pipe sed s^old^new^g

…然后你可以使用管道把输出存储到指定的文件里。

[英文原文:Use multiple CPU Cores with your Linux commands ]

本站文章除注明转载外,均为本站原创或编译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创开源社区。
转载请注明:文章转载自 开源中国社区 [http://www.oschina.net]
本文标题:如何利用多核CPU来加速你的Linux命令 — awk, sed, bzip2, grep, wc等
加载中

最新评论(55

SudyX
SudyX
瞎扯淡, 慢得要死, 慢了三四倍还不止... 亲测 128G 的大部头文件...
深蓝苹果
深蓝苹果
安装了parallel ,却发现不能执行
mj4738
mj4738

引用来自“emacsen”的评论

引用来自“宝仔love”的评论

根本没用呀?用了反而比不用还慢

貌似的确如此....我用time -p 计时的

我虚拟机,2核四线程,压缩一个2G的文件,采用上述介绍的并行方法,确实有点慢. 可能对于超大文件并且至少配备8核才能体现出优势吧
高耳鸡
高耳鸡
这第二种用法使用了 –block 10M参数, 这是说每个内核处理1千万行——你可以用 这个参数来调整每个"CUP"内核处理多少行数据。
泡不烂的凉粉
泡不烂的凉粉
对于服务器, 别考虑多线程了. 服务器运行的进程数量永远不是一个.
LongRaindy
LongRaindy
真是学习了,看起来很屌
timxx
timxx
经常find grep sed的,得收藏研究下啊,,
Gowd
Gowd
平行应该是一种趋势,收藏一下
pugwoo
pugwoo
这几个命令的瓶颈不在CPU吧,sort命令倒是没见到利用多核cpu加速的例子
jinga50334
jinga50334
今天这个帖子到处都是
返回顶部
顶部