有同學問了這樣一個問題,如果我掌握了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.Entry<String, Integer> statisIps(String fileName) throws Exception {
.
4、IP排序
把通過後的最大IP,進行排序。代碼如下:
public static void main(String[] args) throws Exception {
其實,到這裏,也差不多完成了,不知道你有沒有發現,其實使用內存的多少與IP的重複率有關係?
歡迎在留言處補充,是不是該給我點個贊,支持一下呢,各位老司機