Java 海量數(shù)據(jù)處理方法總結(jié)

Java 程序員面試寶典 筆記

  • Hash 法
  • Bit-map 法
  • Bloom filter 法
  • 數(shù)據(jù)庫(kù)優(yōu)化法
  • 倒排索引法
  • 外排序法
  • Trie 樹(shù)
  • 雙層桶法
  • MapReduce 法

Hash 法

散列

  • hash 函數(shù)盡可能簡(jiǎn)單
  • 函數(shù)的值域必須在散列表的范圍內(nèi)
  • 盡可能減少?zèng)_突

Bit-map 法

位圖 法的基本原理是使用位數(shù)組成來(lái)表示某些元素是否存在. 本方法適用于海量數(shù)據(jù)的快速查找/判重/刪除等等.
與其說(shuō)是算法, 不如說(shuō)是一種緊湊的數(shù)據(jù)結(jié)構(gòu).

Bloom filter 法 (重點(diǎn))

引入了 K (K>1)個(gè)相互獨(dú)立的哈希函數(shù), 保證在給定的空間, 誤判率下, 完成元素判定重復(fù)的過(guò)程. 圖是 k = 3 時(shí)的 bloom filter.

bloom filter k = 3

x, y, z 經(jīng)由哈希函數(shù)映射將各自在 bitmap 中的三個(gè)位置置為 1, 當(dāng) w 出現(xiàn)時(shí),僅當(dāng) 3 個(gè)標(biāo)志位都為 1 時(shí), 才表示 w 在集合中. 圖中的情況會(huì)判定為 w 不在集合中.

bloom filter 的誤差

假設(shè)所有哈希函數(shù)散列足夠均勻, 散列后落到 bitmap 每個(gè)位置的 概率均等. bitmap 的大小為 m, 原始數(shù)集大小為 n, 哈希函數(shù)個(gè)數(shù)為 k:

  1. 1 個(gè)散列函數(shù)時(shí), 接受一個(gè)元素時(shí) bitmap 中某一位置為 0 的概率為:
    1 - 1/m

  2. k 個(gè)相互獨(dú)立的散列函數(shù), 接受一個(gè)元素時(shí) bitmap 中某一位置為 0 的概率為:
    (1 - 1/m)^2

  3. 假設(shè)原始集合中, 所有元素都不相等 (最嚴(yán)格的情況), 講所有元素都輸入 bloom filter, 此時(shí)某一位置仍為 0 的概率為:
    ( 1 - 1/m ) ^ {nk}
    某一位置為 1 的概率為
    1-(1-1/m)^{nk}

  4. 當(dāng)我們對(duì)某個(gè)元素進(jìn)行判重時(shí), 誤判即這個(gè)元素對(duì)應(yīng)的 k 個(gè)標(biāo)志位不全為 1, 但所有 k 個(gè)標(biāo)志位都被置為 1, 誤判率 \epsilon 約為:
    \epsilon \approx [1-(1-1/m)^{nk} ]^k
    這個(gè)誤判率比實(shí)際比值大, 因?yàn)橹v判斷正確的情況也算進(jìn)去了. 根據(jù)極限 {\lim_{n \to \infty}}(1+1/n)^n = e 可以得到:
    \epsilon \approx [1-e^{-{nk}/m} ]^k
    \epsilon得到最優(yōu)解,當(dāng)且僅當(dāng)
    k={m/n}In2 \approx 0.7* {m/n}
    此時(shí), 誤判率 \epsilon 與數(shù)集大小和
    \epsilon \approx (1-e^{-In2})^{-In2* m/n}=0.5^{In2*m/n} = 0.5^k

同時(shí), 由于硬盤(pán)空間時(shí)限制死的, 集合元素個(gè)數(shù) n 的大小反而與單個(gè)數(shù)據(jù)的比特?cái)?shù)成反比, 數(shù)據(jù)長(zhǎng)度為 64 bit 時(shí),
n= 5TB/64bit = 5 * 2^{40} Byte / 8 Byte \approx 2^{34}

若以 m = 16n 計(jì)算, bitmap 集合的大小為
2^{38}Bit = 2^{35} Byte = 32 GB, 此時(shí)的 \epsilon \approx 0.0005, 這是誤差的上限.

bloom filter 通過(guò)引入一定的錯(cuò)誤率, 使得海量數(shù)據(jù)判重在可以接受的內(nèi)存代價(jià)中得以實(shí)現(xiàn), 從上述公式可以看出, 隨著集合中的元素不斷輸入過(guò)濾器中(n增大), 誤差將越來(lái)越大. 但是, 當(dāng) bitmap 的大小 m (指 bit 數(shù))足夠大時(shí), 比如比 所有可能出現(xiàn)的不重復(fù)元素個(gè)數(shù) 還要大 10 倍以上時(shí), 錯(cuò)誤概率時(shí)可以接受的.

import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.util.HashSet;
import java.util.Random;

public class testBloomFilter {

    static int sizeOfNumberSet = Integer.MAX_VALUE >> 4;

    static Random generator = new Random();

    public static void main(String[] args) {

        int error = 0;
        HashSet<Integer> hashSet = new HashSet<Integer>();
        BloomFilter<Integer> filter = BloomFilter.create(Funnels.integerFunnel(), sizeOfNumberSet);

        for(int i = 0; i < sizeOfNumberSet; i++) {
            int number = generator.nextInt();
            if(filter.mightContain(number) != hashSet.contains(number)) {
                error++;
            }
            filter.put(number);
            hashSet.add(number);
        }

        System.out.println("Error count: " + error + ", error rate = " + String.format("%f", (float)error/(float)sizeOfNumberSet));
    }
}

參考: https://blog.csdn.net/zdxiq000/article/details/57626464

數(shù)據(jù)庫(kù)優(yōu)化法

通過(guò)選擇合適的數(shù)據(jù)庫(kù)系統(tǒng)來(lái)優(yōu)化數(shù)據(jù)處理

倒排索引法

外排序法

Trie 法

雙層桶法

MapReduce 法

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晌端,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子淋淀,更是在濱河造成了極大的恐慌勤庐,老刑警劉巖招刹,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡衰腌,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)觅赊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)右蕊,“玉大人,你說(shuō)我怎么就攤上這事吮螺∪那簦” “怎么了帕翻?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)萝风。 經(jīng)常有香客問(wèn)我嘀掸,道長(zhǎng),這世上最難降的妖魔是什么规惰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任睬塌,我火速辦了婚禮,結(jié)果婚禮上歇万,老公的妹妹穿的比我還像新娘揩晴。我一直安慰自己,他們只是感情好贪磺,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布文狱。 她就那樣靜靜地躺著,像睡著了一般缘挽。 火紅的嫁衣襯著肌膚如雪瞄崇。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,842評(píng)論 1 290
  • 那天壕曼,我揣著相機(jī)與錄音苏研,去河邊找鬼。 笑死腮郊,一個(gè)胖子當(dāng)著我的面吹牛摹蘑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播轧飞,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衅鹿,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了过咬?” 一聲冷哼從身側(cè)響起大渤,我...
    開(kāi)封第一講書(shū)人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎掸绞,沒(méi)想到半個(gè)月后泵三,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡衔掸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年烫幕,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片敞映。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡较曼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出振愿,到底是詐尸還是另有隱情捷犹,我是刑警寧澤弛饭,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站伏恐,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏栓霜。R本人自食惡果不足惜翠桦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望胳蛮。 院中可真熱鬧销凑,春花似錦、人聲如沸仅炊。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抚垄。三九已至蜕窿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呆馁,已是汗流浹背桐经。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留浙滤,地道東北人阴挣。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像纺腊,于是被迫代替她去往敵國(guó)和親畔咧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容