最右校招-服务器日志分析:一个十万行log统计问题的c语言代码的实现1
2017-05-14 17:50
696 查看
前段时间做了一个 最右 的校招题,具体可见http://www.ixiaochuan.cn/school/2017/index.html下技术公开题目1,服务器日志分析。
需求:分析服务接口的调用次数和平均响应时长
待分析的服务日志:http://zuiyou.ixiaochuan.cn/download/server_access.log.tgz
下载并解压,解压后有一个文件server_access.log, 文件每一行记录一次服务接口的调用信息,日志格式如下:
15/Nov/2016:03:20:01 /post/httpapi/get_member_like_data 0.004
该行包含三个字段,字段间以空格区分, 第一个字段是访问时间,第二个字段是接口名字,第三个字段是调用的响应时长(单位毫秒)。
请做如下分析:
1.计算每个接口的访问次数,并按次数的倒序排序
2.计算每个接口的平均响应时长
3.计算每个接口响应时长超过100ms的次数
要求如下:
1.请说明算法设计并分析算法的时间和空间复杂度
2.程序执 行时间尽量短,可有效利用机器的多核性能
3.实现语言不限(c/c++/go/python都可以)
花了两天时间做完了,代码在https://github.com/reynoldcn/zuiyou。最终工作的效率还可以,10万条数据处理完,总耗时是1-2s。
大文本的处理应该是互联网公司常遇到的问题吧,也是面试中会经常问到的题目。这里总结一下。以后遇到类似问题也可以参考。
1.题目分析
这个题看到之后,第一反应是最终结果要存在hash表里。因为日志很大,牵扯到的接口数目应该会远小于日志行数,那么在处理过程中,肯定要频繁的查找接口,更新接口信息。
在看题目要求提醒了要有效利用多核性能,那么基本是直接告诉你要多线程去做了。
我认为效率高,先要满足两个事情,第一,整个文本只读一遍;第二,减少等待。试想如果单线程来做,一定是读出一行数据->等待处理完->再继续读。即:
while(hasNextLine){
读出;
统计;
写入结果集;
}
这里面处理的过程会消耗大量的时间。所以我期待的实现方式是,一个线程不断的读,读完分给其他线程处理,分完就不用管了,继续往下读。即
while(hasNextLine){
分给线程x;
}
那么每个线程具体做什么呢?线程负责把收到的日志信息,写入结果集。我们假设有一个table,里面记录了所有要求的信息,即接口名,访问次数,总访问时间,超过0.1s的次数。题目里要求的是平均时间,平均时间就等于总时间除以总次数,所以我们记录总次数就可以了,这样能节省好多次运算。假设我们有一个update的方法,还有一个table,当我们update方法收到一条日志信息时,它做的事情如下:
UpdateResult( LogInfo ){
if table has LogInfo.InterfaceName {
找到table里已经存在的InfoInTable
InfoInTable.访问次数++;
InfoInTable.时间 += LogInfo.时间;
if LogInfo.时间 >= 0.1s
InfoInTable. 超时次数++;
}
else
LogInfo写入table
}
以上就是题目的整体分析和流程
需求:分析服务接口的调用次数和平均响应时长
待分析的服务日志:http://zuiyou.ixiaochuan.cn/download/server_access.log.tgz
下载并解压,解压后有一个文件server_access.log, 文件每一行记录一次服务接口的调用信息,日志格式如下:
15/Nov/2016:03:20:01 /post/httpapi/get_member_like_data 0.004
该行包含三个字段,字段间以空格区分, 第一个字段是访问时间,第二个字段是接口名字,第三个字段是调用的响应时长(单位毫秒)。
请做如下分析:
1.计算每个接口的访问次数,并按次数的倒序排序
2.计算每个接口的平均响应时长
3.计算每个接口响应时长超过100ms的次数
要求如下:
1.请说明算法设计并分析算法的时间和空间复杂度
2.程序执 行时间尽量短,可有效利用机器的多核性能
3.实现语言不限(c/c++/go/python都可以)
花了两天时间做完了,代码在https://github.com/reynoldcn/zuiyou。最终工作的效率还可以,10万条数据处理完,总耗时是1-2s。
大文本的处理应该是互联网公司常遇到的问题吧,也是面试中会经常问到的题目。这里总结一下。以后遇到类似问题也可以参考。
1.题目分析
这个题看到之后,第一反应是最终结果要存在hash表里。因为日志很大,牵扯到的接口数目应该会远小于日志行数,那么在处理过程中,肯定要频繁的查找接口,更新接口信息。
在看题目要求提醒了要有效利用多核性能,那么基本是直接告诉你要多线程去做了。
我认为效率高,先要满足两个事情,第一,整个文本只读一遍;第二,减少等待。试想如果单线程来做,一定是读出一行数据->等待处理完->再继续读。即:
while(hasNextLine){
读出;
统计;
写入结果集;
}
这里面处理的过程会消耗大量的时间。所以我期待的实现方式是,一个线程不断的读,读完分给其他线程处理,分完就不用管了,继续往下读。即
while(hasNextLine){
分给线程x;
}
那么每个线程具体做什么呢?线程负责把收到的日志信息,写入结果集。我们假设有一个table,里面记录了所有要求的信息,即接口名,访问次数,总访问时间,超过0.1s的次数。题目里要求的是平均时间,平均时间就等于总时间除以总次数,所以我们记录总次数就可以了,这样能节省好多次运算。假设我们有一个update的方法,还有一个table,当我们update方法收到一条日志信息时,它做的事情如下:
UpdateResult( LogInfo ){
if table has LogInfo.InterfaceName {
找到table里已经存在的InfoInTable
InfoInTable.访问次数++;
InfoInTable.时间 += LogInfo.时间;
if LogInfo.时间 >= 0.1s
InfoInTable. 超时次数++;
}
else
LogInfo写入table
}
以上就是题目的整体分析和流程
相关文章推荐
- 最右校招-服务器日志分析:一个十万行log统计问题的c语言代码的实现2
- 基于mariadb的日志服务器及用loganalyzer实现日志的管理分析 推荐
- CGI编程 - c语言实现 :网页显示HTML代码的问题
- LogParser——强大的日志分析统计工具
- log4j在jetty服务器下生成的log日志文件的相对路径问题
- centos6.4搭建rsyslog日志服务器和loganalyzer 日志分析工具--续
- Web服务器日志统计分析完全解决方案
- Web服务器日志统计分析完全解决方案
- 用NSIS安装日志install。log解决了一个安装出现隐蔽的问题、不用看代码,可以节省大把时间!开心!
- python自动化工具日志查询分析脚本代码实现
- centos6.4搭建rsyslog日志服务器和loganalyzer 日志分析工具
- Web服务器日志统计分析完全解决方案
- [转]Web服务器日志统计分析完全解决方案
- 在linux下使用webalizer与awstats实现apache服务器的日志分析
- Web服务器日志统计分析完全解决方案
- Web服务器日志统计分析完全解决方案
- Web服务器日志统计分析完全解决方案(转)
- live555源代码分析RTSP服务器实现原理(转)
- 能分析压缩的日志,且基于文件输入的PYTHON代码实现
- 如何处理服务器重启后,日志分析的重新挂载的问题