海量數據處理(數據沒法一次讀入內存處理)

海量數據處理
    所謂海量數據處理,就是基於海量數據的查找、統計、運算等操做。所謂海量數據,就是數據量太大,因此致使要麼是沒法在較短期內迅速解決,要麼是數據太大,致使沒法一次性裝入內存。從而致使傳統的操做沒法實現。
一、分治法——Hash映射
    全部散列函數都有以下一個基本特性:若是兩個散列值是不相同的(根據同一函數),那麼這兩個散列值的原始輸入也是不相同的。這個特性使得散列函數具備肯定性的結果。
    在對大文件進行處理時,若文件過大,沒法一次性讀入內存,能夠考慮採起Hash映射的方法將文件中的元素映射到不一樣大小文件中,而後再依次處理各個小文件,最後合併結果,這樣就下降了問題規模。

二、top K問題
    在大規模數據處理中,常常會遇到的一類問題:如何尋找出最大的前K個數、或最小的K個數。堆也是海量數據處理常常採用的工具

Trie樹、Suffix樹、敗者樹、多路歸併、堆排序、hash_map均可以用到海量數據處理裏面。

三、Bit-map
    Bit-map的原理就是使用位數組來表示某些元素是否存在,因爲採用了bit爲單位來存儲數據,所以在存儲空間方面,能夠大大節省,故適用於海量數據的快速查找、判重、刪除等。
eg:如何利用位邏輯運算實現Bit-map,要求可以表示的最大值爲10,000,000
//思路,一個整形能表示32位,10000000/32獲得要多少個整形
//因爲不可能恰好能被32整除,因此要多加一個整形來表示10000000
#include<iostream>
using namespace std;
#define BITWORD 32
#define SHIFT 5  //一個數左移5位就至關於除以32
#define MASK 0x1F  //掩碼,肯定一個數要表示在一個32位的哪一位上,左移0~31
#define N 10000000
int a[1+N/BITWORD];   //申請一個最小的能表示10000000的數組
void set(int count)  //設置表示數count的對應位爲1,count>=0
{
        a[count>>SHIFT] |= ( 1<<( count & MASK ) ); 
        //count>>SHIFT獲得count要存放在數組中哪個int中,count&MASK
        //獲得在該int中,哪一位要置1。MASK = 0x1F。
        //最後|=加上要置爲1的位
}
void clr(int count)  //將表示count的位置0
{
        a[count>>SHIFT] &= ~( 1<<( count & MASK ) );
}
bool test(int count)  //返回表示count的對應位的狀態
{
        return !!(a[count>>SHIFT] & ( 1<<( count & MASK ) ));
}
int main()
{
        set(10);
        set(20);
        cout<<test(10)<<" "<<test(20)<<" "<<test(30)<<endl;
        clr(10);
        clr(11);
        cout<<test(10)<<" "<<test(20)<<" "<<test(30)<<endl;
        cout<<test(11)<<endl;
        system("pause");
}


四、Bloom Filter(布隆過濾器)
    即Bit-map的擴展,具體而言,Bloom Filter是一個包含了m位的位數組,數組的每一位都初始化爲0,而後定義k個不一樣的Hash函數,每一個Hash函數均可以將集合中的元素映射到位數組中的某一位。
    當向集合中插入一個元素時,根據k個Hash函數能夠獲得數組中的k個位,將這些位所有設置爲1;
    當要查詢某個元素是否屬於集合時,就使用k個哈希函數獲得此元素對應的k個位,若是全部點都是1,那麼元素在集合內,若是有0,元素不在集合內。
    注意:若是一個位置屢次被置爲1,那麼只有第一次會起做用,後面幾回將沒有任何效果。
    總結:Bloom Filter的位數m一般要比集合中的最大元素小得多,可見,Bloom Filter是一種空間效率和時間效率很高的隨機數據結構,但這種高效是有必定代價的:在判斷一個元素是否屬於某個集合時,有可能會把不屬於這個集合的元素誤認爲屬於這個集合。所以,Bloom Filter不適合那些「零錯誤」應用場合。而在能容忍低錯誤率的應用場合下,Bloom Filter經過極少的錯誤換取了存儲空間的極大節省。

五、倒排索引法
    倒排索引也常被稱爲反向索引、置入檔案或反向檔案,是一種索引方法,被用來存儲在全文檢索下某個單詞在一個文檔或者一組文檔中的存儲位置的映射。它是文檔檢索系統中最經常使用的數據結構。
    使用範圍:搜索引擎的關鍵字查詢。
    倒排索引是相對正向索引而言的,正向索引是用來存儲每一個文檔的單詞的列表。在正向索引中,文檔佔據了中心的位置,每一個文檔指向了一個它包含的索引項的序列。也就是說文檔指向了它包含的那些單詞,而反向索引則是單詞指向了包含它的文檔,很容易看到這個反向的關係。
相關文章
相關標籤/搜索