ID和Phone高壓縮比存儲和查詢的簡單例子, 無多線程處理算法
運行環境JDK8+maven緩存
0. 模塊分割多線程
1. 基本思路maven
源文件BCP每一行都轉爲一個全局的RowID,能夠直接映射到FileName+文件偏移+行字節數。性能
身份證,手機號都按照文件映射到 IDtoRowIds, PhonetoRowIds。優化
全部數據都寫入磁盤的索引,經過LRU的堆緩存+操做系統的PageCache來進行快速讀取使用。操作系統
查詢的思路就是經過ID or Phone,經過Bloom過來處理那些索引是須要加載的;獲取到對應的RowID列表後,線程
進行了Merge後,直接拉取源文件的偏移量快速定位的行上。blog
PS. 爲何不從新把原數據寫成新的數據文件,主要是針對業務特色,能夠按文件名淘汰舊文件,加入新的數據文件。而不須要全量更新索引和數據。索引
2. 基於數據的壓縮
18身份證: 能夠表達爲 city + year + 序列號
其中city 能夠用3000+的char來表示;year跟進業務特色根據人類不超過128歲的,能夠壓縮爲1個char;後面的seq最多爲999X,也能夠壓縮爲一個char。最多三個char
手機號:直接轉爲Long略位浪費,因爲運營商的可枚舉,直接將其前三位轉爲char來表示。最多兩個char
3. 巨人的獎盃
索引序列化採用Kryo,具備有高性能序列化,高壓縮比。
大量未知數據最好選擇bloom算法,可是Java的Bitset存儲太浪費,故採用了RoaringBitmap
4. 將來優化方向
B+樹來緩存, 或者採用倒排索引的引擎
經過生產消費模式,快速構建索引