面試官:把訪問P站次數最多的那個哥們兒給我找出來?

有同學問了這樣一個問題,如果我掌握了P站的所有訪問日誌數據(海量),我想找出某一天訪問次數最多的那個IP,並看看到底是那個國家的小哥精力如此旺盛???

image.png

對於這種問題,說到底,就是一個“分與合”的思想。

我們需要從訪問P站日誌中,把具體某一天的所有IP取出來,再逐個寫入到一個大文件中。值得一提的是,IP是32位的,那麼就有2^32個IP,就算扣除特殊IP,在重複量小的情況下,一般來說,不能直接把這些數據放入到內存裏面。

這裏的話,我們需要採用hash映射的方法,比如取模1000,把這個大文件分割成1000個小文件,再去小文件中找出出現頻率最大的IP,並記錄其出現頻次;最後,再從這1000個IP中找到出現頻次最大的IP,這樣便把一個看似不能解決的問題就給解決了。

具體操作:

  1. 對IP地址進行hash(IP)%1000求值,再把海量IP日誌分別存儲到1024個小文件中;

  2. 分別對每一個小文件,構建一個{k:IP ,v:頻次}的map,並記錄下當前小文件頻次最多的IP;

  3. 對得到的這個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的重複率有關係?

歡迎在留言處補充,是不是該給我點個贊,支持一下呢,各位老司機

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章