技术解析

如何加快 AWK 的执行速度?
0
2021-07-12 04:27:24
idczone
有N个1-2 G大的文件,其中第六列是点分表示的IPV4地址
需要给它转换成整数表示。
我写了如下的awk

#!/bin/awk -f

{
len = split($6,a,".")
ip = 0
if (len == 4)
ip = lshift(a[1],24) + lshift(a[2],16) + lshift(a[3],8) + a[4]
printf $1"\t"$2"\t"$3"\t"$4"\t"$5"\t"ip"\n" > o
}

机器CPU是6核的,就起了6个进程去转,每个awk进程基本都是CPU 100了
但是转换一个文件需要15分钟左右,感觉还是太慢

求教有什么方法可以让AWK跑的更快些吗?
上 mapreduce 哈哈

也许是卡在磁盘io上,文件拷到内存里再awk呢?

parallel


囧~hadoop吗,高大上的玩意玩不动啊

可以试试看,创建个ramdisk??

所有的CPU核都已经跑满了,用这个应该不会有加速效果把?

用python 重写试试?

cpu都跑满了,也不会是磁盘io的问题了吧

换个mawk试试看?这个比gawk要快,只是不支持UTF8。
不过也许你用的awk就已经是mawk了。

个人经验,如果没有带缓存的raid卡的话,磁盘io对cpu拖累还是比较大的.


py更慢,真的。。。

可以试试看


试了下 IO还真不是瓶颈,在公司服务器上跑,不知道是不是raid

map + reduce
先把文件 split 成多个
然后放到多台服务器上面跑
然后再把跑的结果 合并起来...
不过如果你们这种需求比较多,还是建议上 hadoop 或者 spark...
毕竟人肉分布式 太 LOW 了.

不知道你说的拖累是什么意思,我的理解,如果程序执行的时候,cpu打满了且不是iowait状态,就不是io的问题
另外,第二次执行的时候,文件都很可能缓存在内存中了

`time perl -MNet::IP -lane '$ip = new Net::IP(@F[5]); @F[5] = $ip->intip(); print "@F"' input.txt > output.txt`
装个 `Net::IP` 用上面的命令单程跑一个文件看看要多长时间?

执行前把环境变量设一下试试?
export LANG=C

同十楼,手工 map reduce
写个 C 程序,可以把文件分成 n 块(分割边界须在换行后),并建 n 个有名管道喂文件块给 awk
==========
既然用 C 了,不如直接 多线程 + mmap + msync

我说的是反话

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服