一、基本想法
对于海量的数据,我们知道如果将IP请求写到日志的话,就变为一个超大文件统计次数的问题,但是单机处理可能速度会比较慢,不能一次性加载到内存计算。
对于这类问题,我们首先想到的就是分治处理的思路。
二、详细思路
分治法就是“化大为小”,“化单为多”,我们可以将所有IP分放在100个文件中,然后分别统计每个文件的topK。
但是需要注意的是, 必须保证每种IP地址只在一个文件中出现,比如我们可以采用模100的算法,将0,1,2,3,4...分别放入一百个文件中,然后使用HashMap分别统计每个文件中IP出现的次数。
到这步之后,如果我们需要统计所有文件的topK,可以采用最小堆的方式。具体的做法是,首先用K个数据构建最小堆,后面的数据依次判断是否入堆,如果入堆则进行调整,最后得到的就是次数最多的一百个IP。
三、总结
(1)将ip地址放入多个小文件中,保证每种IP只出现在一个文件中
(2)利用hashmap统计每个小文件中IP出现的次数
(3)利用最小堆得到所有IP访问次数最多的100个