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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
来这里找志同道合的小伙伴!9 e& [- ]$ d" Q9 L3 a
8 Z, Z' }$ Y1 p+ T# O9 A0 k+ o- u1 E: ?, U1 U
你是否曾经有过要计算一个非常大的数据(几百GB)的需求?或在里面搜索,或其它操作——一些无法并行的操作。数据专家们,我是在对你们说。你可能有一个4核或更多核的CPU,但我们合适的工具,例如 grep, bzip2, wc, awk, sed等等,都是单线程的,只能使用一个CPU内核。0 R3 [# N# J$ Y2 [
- t. G0 M" E. ^* B0 v
$ b" h- `& _+ y6 Y* S; V$ p/ P* Z, y4 Q$ T$ }$ w
借用卡通人物Cartman的话,“如何我能使用这些内核”?! O8 y  d' K5 b5 h6 \
+ v" h7 _1 Z  I; ~8 B( b6 n8 d1 U+ N6 V, U; `8 G3 q7 a! q8 t5 a/ e, _
! C# W0 \' `$ g. r' R" D: L! `, @. J/ F3 O
. W6 P- |& ~5 W& T要想让Linux命令使用所有的CPU内核,我们需要用到GNU Parallel命令,它让我们所有的CPU内核在单机内做神奇的map-reduce操作,当然,这还要借助很少用到的–pipes 参数(也叫做–spreadstdin)。这样,你的负载就会平均分配到各CPU上,真的。
3 |4 F2 H. B' I( M: b4 |0 i4 d, O7 }% U, s0 o5 y1 T# @1 ]! Z

) n4 W( m- S% L. e) B2 b( VBZIP2$ d+ e" [+ g7 z7 u5 g
9 W; _) n6 x1 A$ \: p" x. H  J) ^8 U% d
; t' x5 [' s/ c6 ~7 c/ E+ U) ]
& S8 t  C5 m0 e$ ?1 \' C% R, O6 z7 V! n$ q5 E$ B* v& A% p6 |7 I
. _+ O9 f9 f- F+ w! O  V# U* Lbzip2是比gzip更好的压缩工具,但它很慢!别折腾了,我们有办法解决这问题。$ w% ?% I/ M/ P4 k" A9 J9 {; e, J: s9 n% B
以前的做法:9 E5 `- H# @0 t( `
2 [- ^2 [. u% E' B$ fcat bigfile.bin | bzip2 --best > compressedfile.bz2现在这样:6 D: K0 l3 y* y% `' V- B# l& A8 o! b6 {/ G! w5 D9 T$ N' ~: }3 o& P
cat bigfile.bin | parallel --pipe --recend '' -k bzip2 --best > compressedfile.bz2尤其是针对bzip2,GNU parallel在多核CPU上是超级的快。你一不留神,它就执行完成了。. D0 }: N. Y2 K3 h# _4 I5 o( D
7 Y* e  l* ^2 [
* k; h# }! Z+ J9 K8 Q  ?2 z. v3 s4 d' q: Q! Z* J4 [* Q# M9 J+ q: w/ R& Y5 Z
GREP9 J5 B5 J' t% v. S
2 _$ L" n# u+ ?
, X/ F$ _/ v2 z4 @8 k1 K如果你有一个非常大的文本文件,以前你可能会这样:
& W7 {. L0 O) e" ~. Qgrep pattern bigfile.txt现在你可以这样:+ E4 @" u4 H, v& R4 Y4 k
cat bigfile.txt | parallel  --pipe grep 'pattern'或者这样:4 X; ?% Y4 v% D2 a# U& ~9 _& y$ s0 H
cat bigfile.txt | parallel --block 10M --pipe grep 'pattern'
' a: Q8 N2 V6 K5 F
& k! Z" \/ `; N1 b3 g) W, u- X* w3 |这第二种用法使用了 –block 10M参数,这是说每个内核处理1千万行——你可以用这个参数来调整每个CUP内核处理多少行数据。
' R8 X5 V( [9 V  e% x7 H, }5 t7 o
, H' l! L; r3 }% h7 m; W; @* `! J. r+ D  E8 l/ \. R) b( }; d- r; i( T& [' @8 L# P3 u

  K. B' M# N  Q% O8 F3 f0 a5 J' Q$ ^8 \3 k9 F' Y& q! A8 _/ [: m4 L3 T; [* c
AWK
2 c1 O8 j. J& D1 g" b/ O$ V' L5 ?; n8 H  c! P0 T8 J, Z: t7 a1 ~% A$ U: A4 g6 t# r& ?7 g7 x
下面是一个用awk命令计算一个非常大的数据文件的例子。) M9 F! B: _/ w
) ]7 C1 q4 q6 Q1 W常规用法:/ V; p0 T9 _8 V2 f
cat rands20M.txt | awk '{s+=$1} END {print s}'现在这样:& L0 U6 J# F" o+ D" z1 z  D: p7 Y% D# |1 \$ g- q* q: j6 q
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 P
% N  S+ {8 I' y0 h: U+ R% p2 ~
0 n4 f" I2 s7 x- X( J; ~1 g6 b
  d9 V* ?. K* K6 DWC
5 K2 X7 h- v( n0 g( O
0 h3 |$ @. y, q/ D' r# X' s想要最快的速度计算一个文件的行数吗?7 Y7 ~- u. O1 ~0 h- V
传统做法:
* h& |9 g: q, F2 Qwc -l bigfile.txt现在你应该这样:$ Q" S# [& H/ C  A) {" J' S& X3 U( t
cat bigfile.txt | parallel  --pipe wc -l | awk '{s+=$1} END {print s}'非常的巧妙,先使用parallel命令‘mapping’出大量的wc -l调用,形成子计算,最后通过管道发送给awk进行汇总。% v4 ?% J8 ^3 W. R3 r4 ]/ I! E% d' r$ r
% }' ?: @! c% G( e5 b
4 ]. o6 D! M- D" p1 }( |: s  x2 k8 d, m3 I. R% \2 z7 l
SED: I2 w+ \# g- \! I
7 }: H* V+ |  @2 M% S5 `) P7 [4 Z6 E0 @7 c
' W* l5 c6 }- V+ C3 B想在一个巨大的文件里使用sed命令做大量的替换操作吗?4 T. e2 A  c+ i/ s, M& ]$ o8 m& q
! n9 e/ ^2 B, r8 g0 R& X  ^3 @: D常规做法:0 ^& ^6 W, P7 z# c2 |3 ^; d4 g+ P* b
sed s^old^new^g bigfile.txt现在你可以:2 o7 a. d* R# R" A# ~% V/ T; v
1 l" |8 @3 q& F1 w' o! g( }0 N3 zcat bigfile.txt | parallel --pipe sed s^old^new^g…然后你可以使用管道把输出存储到指定的文件里。+ y* N1 r, y* \) w
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-8-18 09:19 , Processed in 0.125000 second(s), 24 queries , Gzip On.

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

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

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