V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
paw
V2EX  ›  Linux

如何加快 AWK 的执行速度?

  •  1
     
  •   paw · 2015-05-19 19:03:02 +08:00 · 4543 次点击
    这是一个创建于 3502 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有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跑的更快些吗?
    15 条回复    2015-07-22 14:22:50 +08:00
    bengtuo
        1
    bengtuo  
       2015-05-19 19:15:07 +08:00
    上 mapreduce 哈哈
    yuanfangyao
        2
    yuanfangyao  
       2015-05-20 00:20:25 +08:00
    也许是卡在磁盘io上,文件拷到内存里再awk呢?
    ysjdx
        3
    ysjdx  
       2015-05-20 08:47:03 +08:00
    parallel
    paw
        4
    paw  
    OP
       2015-05-20 10:35:43 +08:00
    @bengtuo
    囧~hadoop吗,高大上的玩意玩不动啊

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

    @ysjdx
    所有的CPU核都已经跑满了,用这个应该不会有加速效果把?
    yuankui
        5
    yuankui  
       2015-05-20 11:00:25 +08:00
    用python 重写试试?
    WKPlus
        6
    WKPlus  
       2015-05-20 11:15:35 +08:00
    cpu都跑满了,也不会是磁盘io的问题了吧
    spacewander
        7
    spacewander  
       2015-05-20 11:21:27 +08:00
    换个mawk试试看?这个比gawk要快,只是不支持UTF8。
    不过也许你用的awk就已经是mawk了。
    yuanfangyao
        8
    yuanfangyao  
       2015-05-20 13:24:12 +08:00
    @WKPlus 个人经验,如果没有带缓存的raid卡的话,磁盘io对cpu拖累还是比较大的.
    paw
        9
    paw  
    OP
       2015-05-20 13:43:08 +08:00
    @yuankui
    py更慢,真的。。。

    @spacewander
    可以试试看

    @WKPlus
    @yuanfangyao
    试了下 IO还真不是瓶颈,在公司服务器上跑,不知道是不是raid
    yuankui
        10
    yuankui  
       2015-05-20 14:50:12 +08:00
    map + reduce

    先把文件 split 成多个
    然后放到多台服务器上面跑

    然后再把跑的结果 合并起来...

    不过如果你们这种需求比较多,还是建议上 hadoop 或者 spark...

    毕竟人肉分布式 太 LOW 了.
    WKPlus
        11
    WKPlus  
       2015-05-20 15:43:40 +08:00
    @yuanfangyao 不知道你说的拖累是什么意思,我的理解,如果程序执行的时候,cpu打满了且不是iowait状态,就不是io的问题
    另外,第二次执行的时候,文件都很可能缓存在内存中了
    pityonline
        12
    pityonline  
       2015-05-21 08:23:33 +08:00
    `time perl -MNet::IP -lane '$ip = new Net::IP(@F[5]); @F[5] = $ip->intip(); print "@F"' input.txt > output.txt`
    装个 `Net::IP` 用上面的命令单程跑一个文件看看要多长时间?
    hrong
        13
    hrong  
       2015-05-22 15:00:35 +08:00 via Android
    执行前把环境变量设一下试试?
    export LANG=C
    omph
        14
    omph  
       2015-05-26 20:20:39 +08:00
    同十楼,手工 map reduce
    写个 C 程序,可以把文件分成 n 块(分割边界须在换行后),并建 n 个有名管道喂文件块给 awk
    ==========
    既然用 C 了,不如直接 多线程 + mmap + msync
    bengtuo
        15
    bengtuo  
       2015-07-22 14:22:50 +08:00
    @paw 我说的是反话
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3205 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 10:40 · PVG 18:40 · LAX 02:40 · JFK 05:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.