Bitmap解決10億手機號碼去重實踐案例毕箍,BitSet壓縮存儲30倍
假設(shè)有一個需求,需要對10億的數(shù)據(jù)道盏,進行去重比如手機號碼而柑,身份證號碼等大批量數(shù)據(jù)?
或者我們需要在日志數(shù)據(jù)中荷逞,篩選出活躍用戶該如何操作呢媒咳?或者是批量導(dǎo)入Excel數(shù)據(jù),找出重復(fù)的數(shù)據(jù)种远,相同類型的數(shù)據(jù)做處理等解決方案的實現(xiàn)涩澡,我們需要考慮性能,存儲等維度去分析如何實現(xiàn)才能更加合理
最常見的三種實現(xiàn)方式講解:
1.數(shù)組存儲坠敷,然后for循環(huán)判定妙同,進行去重麻煩,復(fù)雜度較高
2.Hashset膝迎,通過hash取模粥帚,判定數(shù)據(jù)是否重復(fù)方便,天然集合特性
3.推薦的一種方式bitmap的方式
幾種實現(xiàn)方式及其差別限次,請詳見如圖所示
通過上圖計算可以得知芒涡,bitmap可以以最小的內(nèi)存代價,實現(xiàn)10億數(shù)據(jù)去重
我們再來看一下Bitmap的數(shù)據(jù)結(jié)構(gòu)和判定去重的實現(xiàn)原理卖漫,如下圖:
以上就是使用bitmap來實現(xiàn)大批量數(shù)據(jù)判定去重的實現(xiàn)方式费尽,接下來我們使用Java代碼具體實現(xiàn)一下,因為在Java中有一個bitset是一個超級大的數(shù)組來實現(xiàn)懊亡,java中沒有bit依啰,所以使用long類型來代替,long類型有8字節(jié)店枣,就是64位速警,一個long類型可以分為64位就是64個bit
public static void main(String[] args) {
BitSet bitSet=new BitSet();
bitSet.set(5);
boolean flag = bitSet.get(5);
// 打印結(jié)果就是 flag = true
System.out.println("flag = " + flag);
boolean flagIndex = bitSet.get(4);
// 打印結(jié)果就是 flagIndex = false
System.out.println("flagIndex = " + flagIndex);
// 實現(xiàn)電話號碼的需求
// 152 7092 4356 電話號碼前三位都是號碼段,都是固定的鸯两,所以可以使用map存儲闷旧,然后剩余的幾位可以放到BitSet中去
bitSet.set(70924356);
HashMap<String, BitSet> objectObjectHashMap = new HashMap<>(10);
BitSet bitSet152 = objectObjectHashMap.computeIfAbsent("152", k -> new BitSet());
// 因為bitSet只能使用Integer類型 如果只使用8個位,那么就是8乘10億/8288608
bitSet152.set(70924356);
}
以上就是使用bitmap解決Bitmap解決10億手機號碼去重實踐案例钧唐,BitSet壓縮存儲30倍甚至更多的解決方案