找回密码
 注册
关于网站域名变更的通知
查看: 59|回复: 0
打印 上一主题 下一主题

多核CPU怎么来加速你的Linux命令

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2023-6-12 15:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
来这里找志同道合的小伙伴!9 e& [- ]$ d" Q9 L3 a: L7 i, T1 j6 X; t. O

" _3 m3 f$ s, s你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核。5 s( Y3 L6 r% X5 h) x$ G) B
- t. G0 M" E. ^* B0 v. E& y# G5 O9 H4 i

* Z/ \. a8 r1 k, l, l借用卡通人物Cartman的话,“如何我能使用这些内核”?! O8 y  d' K5 b5 h6 \9 q) s# {) N. @$ {' R6 b+ _" b
6 V, U; `8 G3 q7 a! q8 t5 a/ e, _
. b6 v% p7 E& S, X/ D4 q/ e" D: L! `, @. J/ F3 O
+ F  X/ a. {! A" W' E' X- N要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。1 M: @' N9 p4 N& x! Z$ ~

0 S+ s3 a3 b/ ?4 X# h' @& P) \% O8 S8 A$ M& {
BZIP2% ?) j! z$ s8 T; t; }. R
9 W; _) n6 x1 A9 S( W1 R( {0 u& ~& }" N: E
; t' x5 [' s/ c6 ~7 c/ E+ U) ]
" f& n0 b( i3 E: k- O7 V! n$ q5 E$ B* v& A% p6 |7 I7 V3 F. L0 A9 ^% y" ~  e4 S
bzip2是比gzip更好的压缩工具,但它很慢!别折腾了,我们有办法解决这问题。$ w% ?% I/ M/ P4 k" A
* @) i1 ~7 B- q1 p1 ?! w7 @以前的做法:9 E5 `- H# @0 t( `  B  [5 ]& ^0 c/ \' Z
cat bigfile.bin | bzip2 --best > compressedfile.bz2现在这样:6 D: K0 l3 y* y% `' V- B# l& A8 o9 w; w0 x. Q+ d! u
cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2尤其是针对bzip2,GNU parallel在多核CPU上是超级的快。你一不留神,它就执行完成了。/ i  S. y1 t' `# `% S
7 Y* e  l* ^2 [9 x! W, D4 h! D7 G: l' I4 l# M2 F$ o
. v3 s4 d' q: Q! Z* J8 l. I4 Z$ A0 r+ e: m" H) L& A: t
GREP9 J5 B5 J' t% v. S) R. s4 n# U  m* U
1 f8 t" g- {1 @
如果你有一个非常大的文本文件,以前你可能会这样:0 G7 F+ G/ e9 P' {* B9 r
grep pattern bigfile.txt现在你可以这样:
9 x) G2 y& D/ z/ X  y% a3 ccat bigfile.txt | parallel  --pipe grep 'pattern'或者这样:4 X; ?% Y4 v% D
/ A5 x, X, j, V9 O$ i$ @cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'; K- W: T- s- s6 v$ a

1 Z" m0 Z* ]' f( p8 j3 \. m5 N3 ^  T这第二种用法使用了 –block 10M参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。
# m2 t) O# H$ R% f  e% x7 H, }5 t7 o5 Q% W  x6 x; [  H# V8 k$ Q
* `! J. r+ D  E8 l/ \. R
% Q) c+ n$ z& T9 r) R/ s1 \2 I) z6 |9 ]4 j; i
% O8 F3 f0 a5 J' Q$ ^8 \
9 U4 @2 D: A3 B' V- n' X8 a3 b- TAWK6 G/ _  H! X9 Z& x! S
8 H  c! P0 T8 J, Z: t7 a
0 {0 \$ P) m/ W5 L4 h* [; y4 ?下面是一个用awk命令计算一个非常大的数据文件的例子。) M9 F! B: _/ w3 K) ]) P9 u3 a; |; w
常规用法:
* H" ?  E& m; [+ [2 e3 x; v" ncat rands20M.txt | awk '{s+=$1} END {print s}'现在这样:& L0 U6 J# F" o+ D" z1 z  D: p7 Y( e1 p' t5 @# F; |$ s: M- U
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的需要。8 o; R% t; F* q$ e1 u8 P1 f, c2 q, V  v$ G  {
# C5 H0 ?( H9 \! k

) q/ {" K) X' vWC) ]8 K( L8 i( [; m- G5 t- s1 u
. W( j" q7 F3 _8 U8 J6 U; z9 _
想要最快的速度计算一个文件的行数吗?" _' h- b3 P& D2 D4 `+ q
传统做法:$ j+ A, ^& U- K: X
wc -l bigfile.txt现在你应该这样:$ Q" S# [& H/ C  A
- G8 F. ]4 h; W& h2 S7 j5 `cat bigfile.txt | parallel  --pipe wc -l | awk '{s+=$1} END {print s}'非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l调用,形成子计算,最后通过管道发送给awk进行汇总。% v4 ?% J8 ^3 W. R- D: l1 n2 ]! `

' m' a# B2 m3 l' K# x8 Z% K4 ]. o6 D! M- D" p1 }% o6 n# @" h7 a
SED: I2 w+ \# g- \! I
. E3 l% ?6 p, ]% S5 `) P7 [4 Z6 E0 @7 c
4 @( \0 W! {$ c. A, h& z想在一个巨大的文件里使用sed命令做大量的替换操作吗?4 T. e2 A  c+ i/ s, M& ]$ o8 m& q
4 V( Q, ]) m: _3 O5 T( \8 c常规做法:0 ^& ^6 W, P7 z# c5 `9 }! ~) S$ z& T: ?
sed s^old^new^g bigfile.txt现在你可以:2 o7 a. d* R# R" A# ~% V/ T; v
& [) P& U% [" ncat bigfile.txt | parallel --pipe sed s^old^new^g…然后你可以使用管道把输出存储到指定的文件里。
3 h* B! y8 G9 n2 U& [
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-23 08:05 , Processed in 0.125000 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表