您的位置:首页 > 编程语言 > C语言/C++

最右校招-服务器日志分析:一个十万行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
}

以上就是题目的整体分析和流程
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: