海量數據處理方法歸類


海量數據,找出最熱門(頻率最高)的某一數據,或前100的數據。一般情況下數據大小幾百個G,而內存限制就1個G,完成計算。

應用場景:
  (1)海量日志數據,提取出某日訪問百度次數最多的那個IP;
  (2)搜索引擎會通過日志文件把用戶每次檢索使用的所有檢索串都記錄下來, 假設目前有一千萬個記錄(這些查詢串的重復度比較高,雖然總數是1千萬,但如果除去重復后,不超過3百萬個。一個查詢串的重復度越高,說明查詢它的用戶越多,也就是越熱門。),請你統計最熱門的10個查詢串,要求使用的內存不能超過1G。
  解決思路:主要是內存限制。如果內存夠,那好,我們用用排序就OK了;那內存不夠,我們就分批次來。分批次來,那么首先思考要怎么分批?顯然要滿足的條件就是盡量把相同的日志、IP分到同一個文件中去,這樣避免多個文件中還互相包含同一條日志。順理成章,若分為1000個小文件,根據hash(IP) % 1000將日志對號入座,然后分別對每個小文件用hashMap進行頻率統計,最后再將1000個小文件中最**(前**)的日志提取出來,利用常規的排序即可。

有10個文件,每個文件1G,每個文件的每一行存放的都是用戶的query,每個文件的query都可能重復。要求你按照query的頻度排序

解決思路:典型的Top K算法。模板:先用HashMap統計頻率(或去重),維護一個K大小的堆,統計Top K就行了。

給定a、b兩個文件,各存放50億個url,每個url各占64字節,內存限制是4G,讓你找出a、b文件共同的url?

解決思路:可以估計每個文件安的大小為5G×64=320G,遠遠大於內存限制的4G。所以不可能將其完全加載到內存中處理。考慮采取分而治之的方法。
遍歷文件a,對每個url求取hash(url)%1000,然后根據所取得的值將url分別存儲到1000個小文件(記為a0,a1,...,a999)中。這樣每個小文件的大約為300M。
遍歷文件b,采取和a相同的方式將url分別存儲到1000小文件(記為b0,b1,...,b999)。這樣處理后,所有可能相同的url都在對應的小文件    (a0vsb0,a1vsb1,...,a999vsb999)中,不對應的小文件不可能有相同的url。然后我們只要求出1000對小文件中相同的url即可。
求每對小文件中相同的url時,可以把其中一個小文件的url存儲到hash_set中。然后遍歷另一個小文件的每個url,看其是否在剛才構建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

在2.5億個整數中找出不重復的整數,注,內存不足以容納這2.5億個整數

方案1:采用2-Bitmap(每個數分配2bit,00表示不存在,01表示出現一次,10表示多次,11無意義)進行,共需內存2^32 * 2 bit=1 GB內存,還可以接受。然后掃描這2.5億個整數,查看Bitmap中相對應位,如果是00變01,01變10,10保持不變。所描完事后,查看bitmap,把對應位是01的整數輸出即可。
方案2:也可采用與第1題類似的方法,進行划分小文件的方法。然后在小文件中找出不重復的整數,並排序。然后再進行歸並,注意去除重復的元素。

給40億個不重復的unsigned int的整數,沒排過序的,然后再給一個數,如何快速判斷這個數是否在那40億個數當中?

位圖法比較適合於這種情況,它的做法是按照集合中最大元素max創建一個長度為max+1的新數組,然后再次掃描原數組,遇到幾就給新數組的第幾位置上1,如遇到5就給新數組的第六個元素置1,這樣下次再遇到5想置位時發現新數組的第六個元素已經是1了,這說明這次的數據肯定和以前的數據存在着重復。此法以內存為代價。
方法總結:內存不夠,分治之;如何分治,取hash;想取TOP K,就用堆!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM