有同學問了鴨哥這樣一個問題,如果我掌握了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位址,寫入檔案:
2、分割檔案
把這個大檔案分割成1000個小檔案,代碼如下:
3、統計IP
對每個小檔案裡面的ip進行統計,并擷取最大頻次的ip,代碼如下:
.
4、IP排序
把通過後的最大IP,進行排序。代碼如下:
其實,到這裡,也差不多完成了,不知道你有沒有發現,其實使用記憶體的多少與IP的重複率有關系?
歡迎在留言處補充,鴨哥又碼字一篇了,是不是該給我點個贊,支援一下呢,各位老司機