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环) + 虚拟节点
- 实际含义:例如,社交网站,将来自一个地区的用户尽可能存储在同一个机器上。
- 优点:避免多台机器查找,降低延迟;
- 缺点:使用查找表。