問題例項:給你a,b兩個檔案,各存放50億條url,每條url占用64位元組,記憶體限制是4g,讓你找出a,b檔案共同的url。如果是三個乃至n個檔案呢?
根據這個問題我們來計算下記憶體的占用,4g=2^32大概是40億*8大概是340億,n=50億,如果按出錯率0.01算需要的大概是650億個bit。現在可用的是340億,相差並不多,這樣可能會使出錯率上公升些。另外如果這些urlip是一一對應的,就可以轉換成ip,則大大簡單了。
ip的數目還是有限的,最多2^32個,所以可以考慮使用hash將ip直接存入記憶體,然後進行統計。
問題例項:
1)已知某個檔案內包含一些**號碼,每個號碼為8位數字,統計不同號碼的個數。
8位最多99 999 999,大概需要99m個bit,大概10幾m位元組的記憶體即可。
2)2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
將bit-map擴充套件一下,用2bit表示乙個數即可,0表示未出現,1表示出現一次,2表示出現2次及以上。或者我們不用2bit來進行表示,我們用兩個bit-map即可模擬實現這個2bit-map。
問題例項:
1)100w個數中找最大的前100個數。
用乙個100個元素大小的最小堆即可。
問題例項:
1).2.5億個整數中找出不重複的整數的個數,記憶體空間不足以容納這2.5億個整數。
有點像鴿巢原理,整數個數為2^32,也就是,我們可以將這2^32個數,劃分為2^8個區域(比如用單個檔案代表乙個區域),然後將資料分離到不同的區域,然後不同的區域在利用bitmap就可以直接解決了。也就是說只要有足夠的磁碟空間,就可以很方便的解決。
2).5億個int找它們的中位數。
這個例子比上面那個更明顯。首先我們將int劃分為2^16個區域,然後讀取資料統計落到各個區域裡的數的個數,之後我們根據統計結果就可以判斷中位數落到那個區域,同時知道這個區域中的第幾大數剛好是中位數。然後第二次掃瞄我們只統計落在這個區域中的那些數就可以了。
實際上,如果不是int是int64,我們可以經過3次這樣的劃分即可降低到可以接受的程度。即可以先將int64分成2^24個區域,然後確定區域的第幾大數,在將該區域分成2^20個子區域,然後確定是子區域的第幾大數,然後子區域裡的數的個數只有2^20,就可以直接利用direct addr table進行統計了。
問題例項:
1).有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16個位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
這個資料具有很明顯的特點,詞的大小為16個位元組,但是記憶體只有1m做hash有些不夠,所以可以用來排序。記憶體可以當輸入緩衝區使用。
問題例項:
1).有10個檔案,每個檔案1g, 每個檔案的每一行都存放的是使用者的query,每個檔案的query都可能重複。要你按照query的頻度排序 。
2).1000萬字串,其中有些是相同的(重複),需要把重複的全部去掉,保留沒有重複的字串。請問怎麼設計和實現?
3).尋找熱門查詢:查詢串的重複度比較高,雖然總數是1千萬,但如果除去重複後,不超過3百萬個,每個不超過255位元組。
1. 給你a,b兩個檔案,各存放50億條url,每條url占用64位元組,記憶體限制是4g,讓你找出:a,b檔案共同的url。
解法一:hash成記憶體大小的小塊檔案,然後分塊記憶體內查交集。
解法二:bloom filter(廣泛應用於url過濾、查重。參考
2. 有10個檔案,每個檔案1g, 每個檔案的每一行都存放的是使用者的query,每個檔案的query都可能重複。要你按照query的頻度排序。
解法一:根據資料稀疏程度演算法會有不同,通用方法是用hash把檔案重排,讓相同query一定會在同乙個檔案,同時進行計數,然後歸併,用最小堆來統計頻度最大的。
解法二:類似1,但是用的是與簡單bloom filter稍有不同的cbf(counting bloom filter)或者更進一步的sbf(spectral bloom filter,參考
解法三:mapreduce,幾分鐘可以在hadoop集群上搞定。參考
3. 有乙個1g大小的乙個檔案,裡面每一行是乙個詞,詞的大小不超過16個位元組,記憶體限制大小是1m。返回頻數最高的100個詞。
解法一:跟2類似,只是不需要排序,各個檔案分別統計前100,然後一起找前100。
海量資料處理題目小結
解決這類題目的思路一般為 1 能否用特殊的資料結構解決 位圖,布隆,堆。2 雜湊切分 1。給乙個超過100g大小的log file,log中存著ip位址,設計演算法找到出現次數最多的ip位址 思路分析 1.要進行雜湊切分編號,log file可以看做是字串,利用雜湊字串轉換演算法進行轉換,轉換成整型...
海量資料處理
1 有一千萬條簡訊,有重複,以文字檔案的形式儲存,一行一條,有 重複。請用5分鐘時間,找出重複出現最多的前10條。方法1 可以用雜湊表的方法對1千萬條分成若干組進行邊掃瞄邊建雜湊表。第一次掃瞄,取首位元組,尾位元組,中間隨便兩位元組作為hash code,插入到hash table中。並記錄其位址和...
海量資料處理
給定a b兩個檔案,各存放50億個url,每個url各占用64位元組,記憶體限制是4g,如何找出a b檔案共同的url?答案 可以估計每個檔案的大小為5g 64 300g,遠大於4g。所以不可能將其完全載入到記憶體中處理。考慮採取分而治之的方法。遍歷檔案a,對每個url求取hash url 1000...