1、尋找 top ip
個人捋之:海量,直接處理往往不中。
1)設計乙個hash函式,其功能為將任意ip位址對映為乙個數,再將該數對某個不太大的數取餘,使得任意ip -> 乙個不太大的數(比如1000)。這樣就保證能實時地將現有日誌中所有的ip分布到1000個桶裡,我們每次只將乙個桶提到記憶體裡然後處理;
2)逐個將桶提到記憶體裡,按value(次數)sort,取最大對,存下;
3)對這1000個鍵值對按次數排序,再取最大次數,得到對應鍵值即為所求。
2、搜尋引擎會通過日誌檔案把使用者每次檢索所使用的所有查詢串都記錄下來,每個查詢串的長度為
1-255 位元組。假設目前有 1000 萬個查詢記錄(但因為這些查詢串的重複度比較高,所以雖然總數是 1000
萬,但如果除去重複後,不超過 300 萬個查詢字串),請統計其中最熱門的 10 個查詢串,要求使用的
記憶體不能超過 1g。
個人捋之:
1)1000萬 * 255 byte = 2.5g > 1g,so 全部讀入記憶體處理不成。但是題目裡提到很多重複,去重後大概需要800m,自然而然想到使用stl中的map或者hash_map或者trie樹起乙個過濾作用,從檔案中逐條讀入記錄,加入到map中。 2)
排序,不過既然是top k 的題,自然想到用堆排。
這題資料量比較坑爹,不大不小。如july所說,如果是1億個查詢記錄呢?
個人捋之:
1)25g >> 1g。考慮將這個大檔案拆分成若干個能處理的小檔案,比如說100個。拆分的方式不妨採用hash對映的方式:從原檔案讀一行,fgets(oneline, input.txt);再用hash函式算個hash值,long long hashvalue = hashfunc(oneline);再將該值對100取餘,hashvalue %= 100;將其寫入hashvalue對應的那個桶對應的那個小檔案中;
之後兩種方法:
1>對這100個小檔案,各自map去重,然後取top10;再對所有的top10 取 top10;
2>對這100個小檔案,使用外排序,得top10;
3、海量資料分布在 100 臺電腦中,請想個辦法高效統計出這批資料的 top 10。
個人捋之:比較簡單趕腳,100臺電腦各自取top10,然後將這100個排完序的結果傳給控制機,外排序,再取topk就哦了。
哦豁:少考慮了一點,如果這些分布在不同電腦中的資料有相同的怎麼辦?可以先reduce起來,hash對映一下,再map下去,確保每台電腦上的資料是唯一的,再像之前的處理就可以了。
4、有 10 個檔案,每個檔案 1g,每個檔案的每一行存放的都是使用者的 query,每個檔案的 query 都可能重
復。要求你按照 query 的頻度排序。
個人捋之:
1)依次讀入這10個檔案,通過hash對映為100個hash桶,每個桶寫成乙個檔案。即得到100個檔案,每個100mb。且各個檔案之間沒有重複query;
2)但此時每個檔案內部還是存在相同的query,可以用trie樹或者map去統計每個query的次數資訊。
3)這100個檔案各自排序,然後通過外排序歸併。由於100m的query,仍然數量很大,可以考慮每個100m檔案先拆分成更小粒度的檔案,先進行一層歸併。
5、給定 a、b 兩個檔案,各存放 50 億個 url,每個 url 各佔 64 位元組,記憶體限制是 4g,請找出 a、b 檔案共
同的 url。
個人捋之:
1)100個url 6.4k,10w個url 6.4m,1億的話,6.4g,50億,320g的大小...
2)bloom過濾?m個bit,t 個hash函式,將a檔案中每個url對映為 t 個hashvalue,並將對應的位數置為1。再在b檔案中每個url用同樣的t個hash函式對映t個hashvalue,如果對應的位數均為1,說明該url在a檔案和b檔案中共現過。問題在於m和t分別怎麼設呢?木有經驗。
Oracle 海量資料處理 索引的選擇
在oracle資料庫中,索引按照索引機制的不同,可以分為三種。1.b tree索引 b tree index 應用場景 oltp 使用比較多,處理鍵值重複率比較低的字段比較適合使用b tree索引,處理效率極高。反之當鍵值重複率很高時,b tree索引的效率會非常的低效。在oracle中主鍵會預設加...
海量資料處理的top K個數的問題
這個問題有兩種的思路,第一種是將整個的數組建堆,時間複雜度是o n 再分k次從堆的頂端取值,取完值之後將堆尾的元素放到堆首來下慮 k logn 總的時間複雜度是 o n k logn 對原始的資料原地建最大堆,時間為o n 然後提取k次,每次提取時,取第乙個值再下沉,k logn,總的時間複雜度是o...
被神化的海量資料處理和高併發處理
實任何簡單的問題,只要規模大了都會成為乙個問題,就如中國人口多,很多小問題都會變成大問題一樣。但處理這種海量資料的方法無非就是分治和 人海 戰術。使用人海戰術的前提是問題的劃分能夠支援這種人海戰術,其手段無非是切割 縱向,橫向 和負載均衡。縱向分隔主要是按業務 功能 來分,也就是所謂面向服務架構,橫...