(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的库来做了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 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的设计模式综述