Linux或Mac下的并行(parallel)文本处理

Reading time ~2 minutes

平常数据处理时,有时并不直接用Spark或MR来做。一者是我司内部重编译打包提交任务还是蛮麻烦的。 二者若数据量不太大,简单的文本处理awk、sed等做着却更方便省事儿快捷。

但仅仅用awk和sed是不能并行,也就不能充分利用单台机子的CPU的,所以比如尴尬的文件如10G,处理起来就比较慢了。要是能利用单机的16CPU该是多好?

GNU Parallel

接着我就发现了GNU Parallel这货。

安装

Mac装起来比较简单

brew install parallel

就可以了,其他系统可以参照上面的链接的Downloading GNU Parallel部分。

使用

使用可参照parallel --help,下面讲几个常用的。 ​
./parallel -k --no-notice -j 16 --pipe -q

其中参数: -k表示输出与原有顺序, -j就是跑jobs的数量,也就是并行的数量, -q表示-quote,就是后面跟的命令中如果包含特殊字符,不必用转义符\--pipe就是丛stdin里读取并分割处理, --no-notice就是为了让parallel不唠叨。

例子

现在给一个word count的例子吧

parallel <$FILE --no-notice -j 16 --pipe -q awk '{for(i=1;i<=NF;i++) words[$i]+=1}END{for(w in words) print w "\t" words[w]}' | awk '{words[$1]+=$2}END{for(w in words) print w "\t" words[w]}'

但其实这个例子不太好。因为这个wc的瓶颈在未并行的第二个awk,而且使用pipeline,会导致前面并行的awk阻塞。而如果只是对每一行做一些文本处理,用parallel并行提速,自然最好不过了。

Original post: http://blog.josephjctang.com/2014-12/paralell-in-text-processing/

问问题的妙用

记得看《你的灯亮着吗?》这本书时就感觉通过提问的方式比陈述、祈使效果都好很多。原书说的是这么一个场景,就是说日内瓦湖景区的上山隧道。进隧道通常都需要开大灯,可出隧道时司机们往往忘记关大灯,而搞得游完景区后车上的电已经耗尽,只得拖车或让警察来帮助发动。后来就出了几个版本的提示语:1. **请关灯...… Continue reading

时间管理中的断舍离

Published on May 20, 2018

科學の上網的便捷方法

Published on February 03, 2018