系统运维

腾讯面试:如何实现10亿数据判重?

字号+作者:益华科技来源:域名2025-11-03 23:59:41我要评论(0)

当数据量比较大时,使用常规的方式来判重就不行了。例如,使用 MySQL 数据库判重,或使用 List.contains() 或 Set.contains() 判重就不可行,因为 MySQL 在数据量大

当数据量比较大时,腾讯使用常规的面试方式来判重就不行了。

例如,何实使用 MySQL 数据库判重,现亿或使用 List.contains() 或 Set.contains() 判重就不可行,数据因为 MySQL 在数据量大时查询就会非常慢,判重而数据库又是腾讯及其珍贵的全局数据库资源。

《阿里巴巴Java开发手册》上也说了,面试如果单表数据量超过 500 万或 2GB 时就建议分库分表了,何实如下图所示:

所以数据库去重显然是现亿不行的。而使用集合也是数据不合适的,因为数据量太大,判重使用集合会导致内存不够用或内存溢出和 Full GC 频繁等问题,腾讯所以此时我们的面试解决方案通常是采用布隆过滤器来实现判重。

知识扩展

除了布隆过滤器之外,何实我们还可以使用 BitMap(位图)的数据类型来实现判重。

位图(BitMap)是一种数据结构,用于表示一个特定范围内的元素是否存在或者某种状态,通常用二进制位来表示。在位图中,每一个位只能是服务器租用 0 或 1,分别表示元素不存在或存在。位图通常用一个 bit 数组来实现,每个 bit 位对应一个元素,如下图所示:

其中,上图中的 1 表示有值,上面 BitMap 描述的值是 1,3,5。

BitMap 优点分析

位图的优势包括:

空间效率优势:位图极大地节省了存储空间。对于大量稀疏数据,特别是当元素数量远大于实际存在的项时,相比于使用传统的列表、集合等数据结构,位图占用的空间极小。查询速度:由于内存访问是按字节或字进行的,因此对单个元素的存在性检查时间复杂度为 O(1),即常量时间,非常快速。批量操作高效:对于批量插入、删除和查询操作,尤其是统计某一范围内元素的数量,服务器托管位图表现出优秀的性能。

BitMap VS int

以 Java 中的 int 为例,来对比观察 BitMap 的优势,在 Java 中,int 类型通常需要 32 位(4 字节*8),而 BitMap 使用 1 位就可以来标识此元素是否存在,所以可以认为 BitMap 占用的空间大小,只有 int 类型的 1/32,所以有大数据量判重时,使用 BitMap 也可以实现。

PS:布隆过滤器的底层就是基于 BitMap 数据结构实现的。

BitMap 在 Java 中的使用

BitMap 在 Java 中的具体实现是 java.util 中的 BitSet,BitSet 是一个可变大小的位向量,能够动态增长以容纳更多的位数据,以下是 BitSet 基本使用示例:

复制import java.util.BitSet; public class BitmapExample { public static void main(String[] args) { // 创建一个BitSet实例 BitSet bitmap = new BitSet(); // 设置第5个位置为1,表示第5个元素存在 bitmap.set(5); // 检查第5个位置是源码库否已设置 boolean exists = bitmap.get(5); System.out.println("Element at position 5 exists: " + exists); // 输出: Element at position 5 exists: true // 设置从索引10到20的所有位置为1 bitmap.set(10, 21); // 参数是包含起始点和不包含终点的区间 // 计算bitset中所有值为1的位的数量,相当于计算设置了的元素个数 int count = bitmap.cardinality(); System.out.println("Number of set bits: " + count); // 清除第5个位置 bitmap.clear(5); // 判断位图是否为空 boolean isEmpty = bitmap.isEmpty(); System.out.println("Is the bitset empty after clearing some bits? " + isEmpty); } }1.2.3.4.5.6.7.8.9.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 声卡驱动的使用教程(轻松了解声卡驱动的安装和设置方法)

    声卡驱动的使用教程(轻松了解声卡驱动的安装和设置方法)

    2025-11-03 23:23

  • 针对万亿级应用,如何更好的优化数据中心效率?

    针对万亿级应用,如何更好的优化数据中心效率?

    2025-11-03 22:57

  • 数据中心如何将其电力基础设施用于电网运营

    数据中心如何将其电力基础设施用于电网运营

    2025-11-03 22:23

  • 如何利用边缘数据中心重塑计算的未来

    如何利用边缘数据中心重塑计算的未来

    2025-11-03 21:30

网友点评