您的位置 首页 > 数码极客

【百度ip地址】程序员每日一题:访问百度最多次数的ip

问题说明

每个IP访问百度的IP地址都记录在后台日志文件中。假设一天的访问日志中有100G,那么查找一天中访问百度最多的IP地址。可用内存大小为512M。

问题分析

这道题主要要解决2个问题:100G的超大文件不能加载到内存,如何处理;有限的内存如何处理全量IP计数。

首先解决大文件问题,也就是如何处理100G的一个大文件,这个通常的解决方法就是将大文件分解成许多小文件。

IP地址是32位的二进制数,所以共有N=2^32=4G个不同的IP地址, 创建一个unsigned count[N];的数组,即可统计出每个 IP 的访问次数,而 sizeof(count) == 4G*4=16G, 远远超过 了 32 位计算机所支持的内存大小,因此不能直接创建这个数组.

解决思路

我们可以通过对IP地址求hash然后对1024取模将一个100G的大文件分解成1024个小文件(file0,file1......file1023),注意这里的1024个文件并不是平均分的,也就是每个文件大小并不是(100G/1204)。当然我们考虑的时候可以假设文件是平均分的,那么每个文件大小为100M,这样一个100M的文件是可以全部读入大小为512M内存中。这样就解决了第一个文件太大不能一次读入内存的问题。

解决方法

1.IP地址最多有2^32=4G种取值情况,所以不能完全加载到内存中处理;

2.可以考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每个小文件最多包含4MB个IP地址;

3.对于每一个小文件,可以构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址;

4.可以得到1024个小文件中的出现次数最多的IP,再依据常规的排序算法得到总体上出现次数最多的IP;

伪代码

Mark for future reference

hash(IP)%N get many small files

int max = 0;

String maxip = null;

for each file

Hashmap hashmap;

String IP = readIP(file);

i(IP)) {

int cnt = (IP);

(IP, cnt+1);

if(cnt+1 > max) {

max = cnt+1;

maxip = IP;

}

}

else (IP, 1);

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐