一、BitMap
解決的問題:
大數據量下的排序、查找、去重。
1、關鍵
通過 bit位 表示一個數值的狀態(是否存在),那麼1MB能大約表示 800萬數值 (1,000,000B * 8 bit )
2、侷限性:
1、內存限制:10位的數值(即99億), 佔用 1.25GB內存
2、一般應用在數值類型。字符串映射到 BitMap 存在Hash碰撞的問題(引入bloom filter)
3、不適合數據稀疏。比如要存入(10,10000,100000000)這三個數據(引入 Roaring BitMap)
3、應用場景
- 對 不重複的 密集整數 進行排序
- 查找數據是否存在海量集合中
- 找出沒有重複的數據(兩個bit位標識一個數值的狀態)
二、Bloom Filter
解決的問題:
判斷一個元素是否屬於這個集合
1、關鍵
內存佔用極少,不侷限於數值類型。
2、侷限性
存在錯誤率。
PS.
哈希函數個數 k、 位數組大小 m、輸入key的數量 n
對於給定的m、n,當 k = ln(2)* m/n 時出錯的概率是最小
3、應用場景
- MapReduce:BloomFilter 簡介及在 Hadoop reduce side join 中的應用
- HBase 提高隨機 讀 的性能
- 查找key(不侷限於數值) 是否存在海量集合中。
- 是否爬蟲爬過
- 是否黑名單
三、基數計算
hyperloglog,落地場景:kylin & spark 對於 count distinct 操作