技术宅,fat-man

增加语言的了解程度可以避免写出愚蠢的代码

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

(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] "\t" 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的库来做了。

posted on   codestyle  阅读(635)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示