海量數據處理的總結

一.給一個超過100G大小的log file,log中存着IP地址,設計算法找到出現次數最多的IP地址
1.切分文件:因爲ip地址是32位的(ipv4)的字符串,當100G放不下,我們要對其進行切分,切分成1000個小文件,再對每個文件編號。
2.計算文件的位置:將每個文件ip,映射到哈希表中,但是要注意到一點是,利用哈希函數將ip轉化成整數,用函數表示:pos=hash(ip)%1000;
3.統計每個文件的ip次數:用一個map去統計,map< string,int> MaxXCountIp, 用這個map去讀取單個文件,保存下單個文件的最大出現次數。 
4.一直遍歷完剩下的文件,就可以知道出現次數最多的ip
二.給一個超過100G大小的log file, log中存着IP地址, 設計算法找到出現次數最多的前K個IP地址?如何直接用Linux系統命令實現?
這個題是第一個題的變形:如果要統計次數出現最多的前K個IP地址,可看作爲TopK問題,具體做法爲:
1.統計出1000份文件中每個文件裏出現次數最多的IP 
2.選取K個IP建立小堆,在依次取K之後的每一個IP與堆頂元素比較,如果大於堆頂元素,則覆蓋堆頂數據,並進行向下調整,反之繼續遍歷源程序; 
3.最後堆裏的元素爲出現次數最多的前K個IP

Linux系統命令實現:

sort logfile | uniq -c | sort -nr | head -K 
sort 默認是用字符串的比較方法比較大小的,倆個字符串比較大小的時候,遇見第一個不同字符,第一個不同字符,誰的ASCII碼大,就是那個字符串大。 
sort -n 選項 : 按照數字大小比較 
sort -r : 本來sort 從小到大輸出,現在逆置從大到小輸出。 
head -K : K是一個具體的數字,輸出最大的K個。 
uniq -c : uniq 是把相鄰的去重,加C是並顯示出出現次數。 
總結上面這個命令: 先把所有字符串重複的放一起,然後去重統計次數,最後按出現的次數大小排序,最後輸出前K個
三.給兩個文件,分別有100億個query,我們只有1G內存,如何找到兩個文件交集?分別給出精確 
算法和近似算法! 

精確算法:可以用位圖,用兩個位圖剛好1G。求文件交集,只需要將文件1,2,分別建立在位圖1,2中,然後對兩個位圖進行與運算,得到的便是交集。

近似算法:用布隆過濾器,開2的32次方-1個大小的位(最大個數的位),對第一個大數據文件的數據進行- 射,然後再讀取第二個大數據文件,每讀一個query 就find 下,讓布隆過濾器判斷是否在裏面,如果在布隆中就是交集中的元素。
因爲布隆存在誤判,存在不是準確的,不存在一定是準確的。

四.給上千個文件,每個文件大小爲1K—100M。給n個詞,設計算法對每個詞找到所有包含它的文件,你只有100K內存! 

1.將你所要搜索的詞進行分組,也就是獲取到關鍵字,獲取到關鍵字後去上千個文件中查找 
2.對於每個文件,我們可以建立布隆,並在這些建好的布隆當中查看是否有我們已經獲取好的關鍵字 
3.進行布隆過濾後,我們考慮建立哈希表(拉鍊法),此時哈希表的存放的不是鏈表的地址,而是文件的地址,如果某一文件中含有關鍵字,就將其文件的地址存放在哈希表Key(關鍵字)對應位置 
4.關鍵字在哈希表中映射的位置所保存的文件就是包含這個關鍵字的文件

五.有一個詞典,包含N個英文單詞,現在任意給一個字符串,設計算法找出包含這個字符串的所有英文單詞!

給輸入字符串,利⽤用字母建立倒排索引,索引中存儲該字母 出現在哪個單詞以及在單詞中位置;
查詢時,利用倒排找到所有的單詞,並求交集並且位置要連續







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