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


海量數據處理
    所謂海量數據處理,就是基於海量數據的查找、統計、運算等操作。所謂海量數據,就是數據量太大,所以導致要么是無法在較短時間內迅速解決,要么是數據太大,導致無法一次性裝入內存。從而導致傳統的操作無法實現。
1、分治法——Hash映射
    所有散列函數都有如下一個基本特性:如果兩個散列值是不相同的(根據同一函數),那么這兩個散列值的原始輸入也是不相同的。這個特性使得散列函數具有確定性的結果。
    在對大文件進行處理時,若文件過大,無法一次性讀入內存,可以考慮采取Hash映射的方法將文件中的元素映射到不同大小文件中,然后再依次處理各個小文件,最后合並結果,這樣就降低了問題規模。

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

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

3、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");
}


4、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通過極少的錯誤換取了存儲空間的極大節省。

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


免責聲明!

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



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