应用访问地域排名

题目内容:给定陌陌一段时间的Nginx AccessLog(多个文件,估计66G左右),以最快的方式找到访问次数最多的5个IP。提交脚本或是可执行程序,约定以命令行参数的形式传入文件所在路径。按照次数降序输出5个IP,每个IP一行。

已知说明:

 1. Linux Centos7服务器,配置限制在内存2G,4核CPU

 2. Nginx access log 放置在指定目录下, 文件内容格式

'$remote\_addr\\t-\\t$remote_user\t$time_local\t'

'$http\_x\_forwarded\_for\\t$tcpinfo_rtt\t$tcpinfo\_rttvar\\t$tcpinfo_snd_cwnd\t$tcpinfo_rcv_space\t'

'$request\_method\\t$host\t$request\_uri\\t$server_protocol\t$request\_length\\t$request_time\t'

'$status\\t$body_bytes_sent\t$bytes_sent\t'

'$http\_referer\\t$http_user_agent\t'

'$connection\\t$connection_requests\t'

'$upstream\_addr\\t$upstream_status\t$upstream\_response\_length\\t$upstream_response_time\t'

'$scheme\\t$ssl_session_reused';

10.0.0.1 - - 22/Oct/2019:00:00:05 +0800 - 45250 5000 20 14600 POST api.immomo.com /v1/welcome/logs?fr=123456789 HTTP/1.1 567 0.029 200 96 651 - MomoChat/8.20.2 ios/1878 (iPhone 7 Plus; iOS 11.0.3; zh_CN; iPhone9,2; S1) 93983365152 15 10.0.0.1:9000 200 101 0.029 https .

 3. 不限制实现语言,但是不能依赖任何开源的第三方依赖或者服务

 3. 题目输入参数只有一个就是: Accesslog的文件夹路径

 4. 题目输出需要在程序运行路径下创建result的文件,文件内容的格式是:按照访问量倒排的5个IP和对应的访问次数。

比如:

10.12.12.1 10000

102.12.12.2 9999

...

评判规则:

统计准确且耗时最短者胜出

2核4G 机械硬盘

解题思路

性能讨论点

耗时分析

单线程/多线程读写文件快慢?

结论:在我们处理大文件读取的时候,单线程要优于多线程的~

实现代码