ID和Phone高压缩比存储和查询

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+树来缓存, 或者采用倒排索引的引擎

经过生产消费模式,快速构建索引

相关文章
相关标签/搜索