共计 444 个字符,预计需要花费 2 分钟才能阅读完成。
一、基本想法
对于海量的数据,我们知道如果将 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 个
正文完