1. 程式人生 > >面試- 阿里-. 大資料題目- 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,讓你找出a、b檔案共同的url?

面試- 阿里-. 大資料題目- 給定a、b兩個檔案,各存放50億個url,每個url各佔64位元組,記憶體限制是4G,讓你找出a、b檔案共同的url?

假如每個url大小為10bytes,那麼可以估計每個檔案的大小為50G×64=320G,遠遠大於記憶體限制的4G,所以不可能將其完全載入到記憶體中處理,可以採用分治的思想來解決。

  Step1:遍歷檔案a,對每個url求取hash(url)%1000,然後根據所取得的值將url分別儲存到1000個小檔案(記為a0,a1,...,a999,每個小檔案約300M);

  Step2:遍歷檔案b,採取和a相同的方式將url分別儲存到1000個小檔案(記為b0,b1,...,b999);

  巧妙之處:這樣處理後,所有可能相同的url都被儲存在對應的小檔案(a0vsb0,a1vsb1,...,a999vsb999)中,不對應的小檔案不可能有相同的url。然後我們只要求出這個1000對小檔案中相同的url即可。

  Step3:求每對小檔案ai和bi中相同的url時,可以把ai的url儲存到hash_set/hash_map中。然後遍歷bi的每個url,看其是否在剛才構建的hash_set中,如果是,那麼就是共同的url,存到檔案裡面就可以了。

  草圖如下(左邊分解A,右邊分解B,中間求解相同url):

2.有一個1G大小的一個檔案,裡面每一行是一個詞,詞的大小不超過16位元組,記憶體限制大小是1M,要求返回頻數最高的100個詞。

  Step1:順序讀檔案中,對於每個詞x,取hash(x)%5000,然後按照該值存到5000個小檔案(記為f0,f1,...,f4999)中,這樣每個檔案大概是200k左右,如果其中的有的檔案超過了1M大小,還可以按照類似的方法繼續往下分,直到分解得到的小檔案的大小都不超過1M;

  Step2:對每個小檔案,統計每個檔案中出現的詞以及相應的頻率(可以採用trie樹/hash_map等),並取出出現頻率最大的100個詞(可以用含100個結點的最小堆),並把100詞及相應的頻率存入檔案,這樣又得到了5000個檔案;

  Step3:把這5000個檔案進行歸併(類似與歸併排序);

  草圖如下(分割大問題,求解小問題,歸併):

 草圖如下(分割大問題,求解小問題,歸併):

3.現有海量日誌資料儲存在一個超級大的檔案中,該檔案無法直接讀入記憶體,要求從中提取某天出訪問百度次數最多的那個IP。

  Step1:從這一天的日誌資料中把訪問百度的IP取出來,逐個寫入到一個大檔案中;

  Step2:注意到IP是32位的,最多有2^32個IP。同樣可以採用對映的方法,比如模1000,把整個大檔案對映為1000個小檔案;

  Step3:找出每個小文中出現頻率最大的IP(可以採用hash_map進行頻率統計,然後再找出頻率最大的幾個)及相應的頻率;

  Step4:在這1000個最大的IP中,找出那個頻率最大的IP,即為所求。