用linux命令提高php的处理能力
最近,需要对用户访问日志作一些统计分析处理,该日志每天生成,大小平均是1.5G,经其它程序进行预处理后,去掉一些无关信息,减小为300M左右,格式是userId`url`clicks,1000万行左右.
要做的工作是按userId,urlId分组保存到数据库,类似这样:
uid urlId clicks
------------------------
12 1 3
12 2 4
13 1 3
13 2 5
13 11 3
当然,还有其它关联的表,如url表,需要先通过url在url表查找出urlId,如果没有则插入...满足各种需求后,每条记录操作数据库的平均次数是查询4-6次(包括oracle的获得自增id查询),插入/更新3次
假设数据库的操作已经完全优化,要完成这项目任务,使用php的常规办法是打开日志文件句柄,然后遍历处理,这样,1000万条记录一下来,不少于6个小时(硬件配置为8G内存+Xeon1.60GHz 4核 x 2 ,下同)
这样的处理速度明显是不能满足要求的,必须要进行优化,但php本身的优化手段有效,于是,php的好朋友linux上场了:
1)先对日志文件进行排序处理,排序后,可方便按uid进行合并,大大减少了数据库的操作次数
以下是代码片段: //对$cTempFile进行排序,生成排序后的$cSwapFile |
2)对排序后的文件进行切分,启用php模拟进程方式并行处理
以下是代码片段: $threads = 15; //启动的进程数 //切分文件,具体参数可查split帮助 $eventLog = LOG_PATH.'eventLog'; //事件日志 for($i = 0;$i< $threads;$i++){
|
3)进程处理
主进程通过 php __FILE__ -f id 的方式调用子进程
因为是同一个文件,需要判断一下$argv参数,并根椐id生成当前进程要处理的日志文件,开始正常处理入库
经过这样处理后,进程数开到15,同样的日志,全部完成只需1个小时以内,这时cpu的负载还是在极低的水平
要注意的可能是数据库的处理能力了,如果进程数过大,数据库的吞吐可能会造成瓶颈
总结:
1)当需要遍历一个大文件进行时,可以使用切分的方法切成n个较少的文件,再同时并行调用的方式处理,可以有效的减少处理时间.
2)在遍历入库的操作中,有效的合并可以减少数据库的操作次数
建议继续学习:
- vim几个小技巧(批量替换,列编辑) (阅读:35893)
- ps - 按进程消耗内存多少排序 (阅读:11216)
- 100个常用的linux命令 (阅读:10099)
- 每个程序员都应该知道的8个Linux命令 (阅读:9373)
- 最受欢迎的10个 Linux 单行命令 (阅读:8824)
- Linux date 命令获取某日期的前一天 (阅读:8443)
- ps 命令常见用法 (阅读:7863)
- find命令的一点注意事项 (阅读:8141)
- Linux常用系统信息查看命令 (阅读:7309)
- Linux 常见高危操作 (阅读:7007)
扫一扫订阅我的微信号:IT技术博客大学习
- 作者:tim 来源: PHPec
- 标签: 命令
- 发布时间:2009-10-17 14:31:10
- [69] 如何拿下简短的域名
- [68] Go Reflect 性能
- [66] Oracle MTS模式下 进程地址与会话信
- [61] 图书馆的世界纪录
- [61] IOS安全–浅谈关于IOS加固的几种方法
- [60] 【社会化设计】自我(self)部分――欢迎区
- [59] android 开发入门
- [56] 视觉调整-设计师 vs. 逻辑
- [48] 给自己的字体课(一)——英文字体基础
- [48] 读书笔记-壹百度:百度十年千倍的29条法则