1. 程式人生 > >對於大資料的一些處理方法

對於大資料的一些處理方法

問題:資料太大,在記憶體中無法一次性裝入。

題1:給定一個大小超過100億的檔案,該檔案是用來儲存IP地址,找到出現次數最多的IP地址。
分析:100億就是大約就是10G,對於現在的計算機而言,記憶體中無法容納這麼大的檔案。
解決:將一個大檔案切分為多個小檔案,例如:我們可以將該100億的大檔案切分為1000個檔案,即每個檔案的大小大約就是10M,那麼就可以在記憶體中容納得下了。
那麼,我們要怎麼來切分這個100億的大檔案呢?平均分?很顯然是不可以的,如果分到某個檔案的IP地址出現的次數都是1次,那麼該檔案出現最多的IP就是這10M個IP。那麼就會浪費很大的空間,不符合我們的預期。所以,在此我們可以採用雜湊表的方式,對IP先轉換為對應的整數,在對該數取模,將模相同的IP放在同一個檔案之中,那麼這樣在同一個檔案中出現IP相同的概率就會大一些。
然後我們就可以分別統計出這1000個檔案中IP次數最多的IP,然後再將這1000個檔案進行彙總。如下面的圖解。

圖解

題2:給定100億個整數,找到其中只出現一次的整數。
分析:遇到這樣的問題,我們首先想到的處理方法就是:使用一個輔助陣列,用來儲存每個資料出現的次數。那麼我們就需要100億大小的陣列。100億 = 10G = 10 * 4 = 40G,可能就需要40G的記憶體,明顯對於當代的計算機是不可能的。
解決:我們需要的結果是找出出現一次的數字,我們知道,點陣圖可以用來表示一個數字是否存在,可是我們現在要找的數字是出現一次的數字。所以,我們可以將之前的點陣圖進行擴充套件。例如:我們使用兩位來表示一個數字的存在狀態。00:表示該數字不存在;01:表示該數字存在1次;11:表示該數字出現了多次。那麼,這樣100億個數字就只要200億個位,即需要25億位元組,即需要2.5個G就可以進行統計了。在查詢的過程中,我們只需要判斷是否是01,如果是那麼就是我們要找的那個數字。

題3:有兩個檔案,分別由100億個query(查詢詞,即字串),但是隻有1G的記憶體,找到兩個檔案的交集。
分析:對於這樣的 大檔案,同樣的我們不能對其進行處理。因為在當代的計算機中並不能儲存這麼大的資料。
解決:與問題一相似,首先將這兩個大檔案進行切分。切分完後,就產生了很多小檔案,檔案1:file1.1,file1.2,file1.3,file1.4,file1.5,…….檔案2:file2.1,file2.2,file2.3,file2.4,file2.5,…….然後我們將file1中的所有小檔案採用布隆過濾器儲存,然後再處理檔案2的小檔案,在處理檔案2的小檔案時,若file1中也存在該檔案,我們就把它儲存於另外一個檔案中。當檔案2的所有小檔案處理完時,也就找到了兩個檔案的交集。

題4:給定上千個檔案,每個檔案的大小為1K-100M,請設計演算法找到某個詞存在於哪些檔案之中。
解決:首先我們瞭解一下什麼是正排索引,什麼是倒排索引。
簡單的說,正排索引就是根據編號去找對應的資料;而倒排索引就是根據資料去找編號。詳解如下圖所示:
正排索引
倒排索引
那麼,顯而易見,對於這個問題我們就要使用倒排索引的方式:
解決過程:

  1. 首先將每個檔案的資料對應的儲存到一個布隆過濾器之中,可能會存在很多個布隆過濾器。
  2. 然後我們讀取每一個布隆過濾器中的詞,並且記錄每個詞和其對應的檔案,將其儲存在另外一個檔案中,假設這個檔案叫做Information。(即倒排索引的方式儲存)
  3. 將所有的詞分為幾個小部分,分別儲存到布隆過濾器中。
  4. 當遇到一個詞後,我們就要判斷該詞是否存在。那麼,此時我們就可以在儲存單詞的布隆過濾器中查詢,判斷該詞是否存在。
    a.遍歷所有儲存單詞的布隆過濾器,如果存在,也就可以找到其對應的檔案了。若不存在,那麼該單詞不在這些檔案之中。

總結:對於大數的處理方法:

  1. 切分
  2. 使用雜湊,點陣圖,布隆過濾器等演算法。。。。。。。
    這裡寫圖片描述