1. 容量計算
解決海量數據問題前,先對數據的容量進行計算。
- 1 byte = 8 bit
- 1 KB = 2^10 byte = 1024 byte ≈ 10^3 byte
- 1 MB = 2^20 byte ≈ 10^6 byte
- 1 GB = 2^30 byte ≈ 10^9 byte
- 1 億 = 10^8
- 1 個int整數佔 4 byte,1 億個整數佔 4*108 byte ≈ 400 MB。
2. 海量數據判重
2.1 HashSet
答:將海量數據拆分到多臺機器上,每臺機器用HashSet存儲,最好是用hash取模方式將一類數據都存放在同一機器上。
2.2 BitSet
答:構建一定大小的比特數組,讓每個整數都映射到比特數組上,從而得知某個整數是否存在。
- 適用範圍是海量整數數據,且範圍不大。
2.3 布隆過濾器
答:鐵則:布隆過濾器說對其實可能不對,但說不對那就是不對。
布隆過濾器是基於BitSet/BitMap的,每次插入數據都要經過k個哈希函數得到k個位置,把對應位置置爲1。
查找數據時,也是相同流程,得到k個位置,若有一個不爲1,則不存在,若都爲1,可能存在也可能誤判。
- 布隆過濾器只能插入不能刪除。
- 優點在於利用很少的空間達到較高的精確率。
- 多個hash函數,增大隨機性,減少碰撞概率。
- 擴大BitMap範圍,使hash值均勻分佈,減少碰撞。
2.4 前綴樹
答:利用字符串的公共前綴減少查詢時間,查詢效率高。
前綴樹特性是:
- 根節點不包含字符,除根節點外每一個節點都只包含一個字符;
- 從根節點到某一節點,路徑上經過的字符連接起來,爲該節點對應的字符串;
- 每個節點的所有子節點包含的字符都不相同。
- 適用範圍是海量字符串數據。
3. 海量數據拆分
答:將數據拆分到多臺機器上/將大文件拆分成小文件,讓多臺機器一起工作/對小文件求解。
3.1 拆分策略
- 到達順序:每次來的數據都放進當前Server,放滿再放新增機器。
- 優點:充分利用系統資源;
- 缺點:需要查找表來存放數據-機器映射。
- 哈希值:用數據的key進行hash取模 N(機器數量) 得到應放入的機器序號。
- 優點:不需要查找表;
- 缺點:hash分配不均勻;增加新機器全部重新算hash。
- 改進就是一致性hash(hash環) + 虛擬節點
- 實際含義:例如,社交網站,將來自一個地區的用戶儘可能存儲在同一個機器上。
- 優點:避免多臺機器查找,降低延遲;
- 缺點:使用查找表。