zoukankan      html  css  js  c++  java
  • (2010-8-31) awk内存泄漏以及缓慢的正则表达式计算速度

    AWK内存泄露:

    这几天本来就很郁闷,遇到搭建在hadoop平台上的hive平台有很多问题。写个好好的sql语句,总是说这个错误那个错误。然后,今天遇到一个更加郁闷的问题,居然分析淘宝数据的awk都运行不了了,出现了传说中的内存不足的错误。

    如下2个简单的awk语句:

    awk '{match($4, /(search.taobao.com.+uniq=seller.*)/,a); if(a[1] != null) c++;}END{print c}'
    awk '{match($4, /(search.taobao.com)/,a); if(a[1] != null) c++;}END{print c}'

    第一个运行起来好好的,第二个就狂占内存。

    google了一番,原来据说是3.1.7版本之前的gawk都有这类内存泄露问题。而我们的服务器安装的居然是老掉牙的3.1.5。

    咨询运维的兄弟,请求帮忙安装一个最新版上去,再看看情况。

    缓慢的AWK正则:

    最近分析的数据量都很大,一般的时候,都需要用awk从日志里面提取有用的信息,大部分时间都是用一个正则表达式搞定一切。

    接着,俺就发现一个大问题。每次awk进行提取的时候(用match),总是很缓慢,vmstat看到的磁盘io特别小,但cpu却100%。今天俺用java写了一个小类,用来专门搞正则表达式的提取。一测试,发现了如下的情况:
    1、正则表达式:visitKey:([0-9]+).+fullUrl[^,]+([0-9A-F]{32})

    2、awk语句: cat /data/comm_click_log/boss_comm/20100516/* | /usr/local/gawk-3.1.8/bin/awk --re-interval '{match($0,/visitKey:([0-9]+).+fullUrl[^,]+([0-9A-F]{32})/,c); print c[1] " " c[2]}' >tmp

    处理速度为:4040行/s

    3、java语句:cat /data/comm_click_log/boss_comm/20100516/* | java -cp dm.jar dm.util.Extract "visitKey:([0-9]+).+fullUrl[^,]+([0-9A-F]{32})" >tmp

    处理速度为:15873行/s

    用java来做,速度居然是awk的4倍。无语了。遇到大东西俺就用java的库来做了。

  • 相关阅读:
    xdebug安装教程
    如何查看Linux操作系统的位数
    getconf命令【一天一个命令】
    redis 数据类型详解 以及 redis适用场景场合
    Redis和Memcache对比及选择
    无交换机实现集群网络互联
    性能调优攻略
    Chrome 插件集推荐
    在 Linux 下将 PNG 和 JPG 批量互转的四种方法
    Flashback for MySQL 5.7
  • 原文地址:https://www.cnblogs.com/code-style/p/3267349.html
Copyright © 2011-2022 走看看