有同学问了这样一个问题,如果我掌握了P站的所有访问日志数据(海量),我想找出某一天访问次数最多的那个IP,并看看到底是那个国家的小哥精力如此旺盛???
对于这种问题,说到底,就是一个“分与合”的思想。
我们需要从访问P站日志中,把具体某一天的所有IP取出来,再逐个写入到一个大文件中。值得一提的是,IP是32位的,那么就有2^32个IP,就算扣除特殊IP,在重复量小的情况下,一般来说,不能直接把这些数据放入到内存里面。
这里的话,我们需要采用hash映射的方法,比如取模1000,把这个大文件分割成1000个小文件,再去小文件中找出出现频率最大的IP,并记录其出现频次;最后,再从这1000个IP中找到出现频次最大的IP,这样便把一个看似不能解决的问题就给解决了。
具体操作:
对IP地址进行hash(IP)%1000求值,再把海量IP日志分别存储到1024个小文件中;
分别对每一个小文件,构建一个{k:IP ,v:频次}的map,并记录下当前小文件频次最多的IP;
对得到的这个1000个IP,进行常规排序,便能得到最大的IP。
1、构造数据
生成1亿个IP地址,写入文件:
public void genIP(String fileName) throws Exception {
2、分割文件
把这个大文件分割成1000个小文件,代码如下:
public void splitMiniFile(String fileName) throws Exception {
3、统计IP
对每个小文件里面的ip进行统计,并获取最大频次的ip,代码如下:
public Map.EntrystatisIps(String fileName) throws Exception {
4、IP排序
把通过后的最大IP,进行排序。代码如下:
public static void main(String[] args) throws Exception {
其实,到这里,也差不多完成了,不知道你有没有发现,其实使用内存的多少与IP的重复率有关系?
相关文章