前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >场景题:有40亿个QQ号如何去重?仅1GB内存

场景题:有40亿个QQ号如何去重?仅1GB内存

原创
作者头像
卷福同学
发布2025-03-04 18:09:57
发布2025-03-04 18:09:57
1100
举报
文章被收录于专栏:小白晋级大师小白晋级大师

场景题也有一些套路可以考虑,比如去重、判断给定数据是否存在

1.大数据去重

1.1 现在有40亿个QQ号如何去重?仅1GB内存

参考链接:https://juejin.cn/post/7396332696660131849

介绍2种方法:Bitmap和布隆过滤器

方法一:Bitmap

首先介绍下什么是位图Bitmap

位图是使用bit数组表示的,它只存储0或者1,因此我们可以把全部的QQ号放到位图中,当index位置为1时表示该索引位的QQ号已经存在。

数据规模分析+可行性分析

  • QQ号是32位的无符号整型数据,整型数据范围是-2^31, 2^31-1,总计数据量有43亿,可以覆盖40亿的QQ号。直接存储40亿QQ号,需要的空间为40亿 * 4字节 = 14.9GB,超过1GB了。
  • 使用Bitmap来存储,每个QQ号仅占1位,比如:QQ号23333,只需要判断Bitmap的索引位23333是否为1,为1表示数据已经存在,就能判断是否重复了。所需要内存空间: 2 ^ 32 * 1bit / 8 = 512MB

实现步骤

直接用java自带的Bitset来实现代码,假设QQ号都在整型范围内

代码语言:java
复制
//初始化长度为2 ^ 32位的位数组
BitSet bitmap = new BitSet(1L << 32); // 需调整JVM参数 -Xmx1g
//读取QQ号,如果该位为0,标记为1;否则数据重复
while(读取QQ号) {
    if (!bitmap.get(qq)) {
        //数据不存在才set 1,存在则去重了
        bitmap.set(qq);
    }
}
//最后,遍历Bitmap位数组,标记为1的位置就是去重后的结果了

方法二:布隆过滤器

有关布隆过滤器的介绍看下我之前写的文章:布隆过滤器原理和使用场景

  • 相比较位图Bitmap,布隆过滤器使用了多个hash函数计算哈希值作为下标,在位图中的多个下标都为1时,则表示数据已存在
  • 优点:加上哈希算法后,我们还可以对字符串或者对象进行存储去重,比如URL
  • 缺点:存在一定的误判,因为存在哈希冲突的问题

实现方案

使用redis的布隆过滤器模块来实现

代码语言:shell
复制
# 初始化过滤器(容量50亿,误判率0.1%)
BF.RESERVE qq_filter 0.001 5000000000
# 批量添加QQ号
BF.MADD qq_filter 12345678 87654321 ...
# 检查是否存在
BF.EXISTS qq_filter 11223344

2.数据统计

比如在线人员统计,将在线人员id为偏移值,为1表示在线;视频统计,将全部视频的id为偏移存储到Bitmap中

下篇分享在线数据统计的场景题

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.大数据去重
    • 1.1 现在有40亿个QQ号如何去重?仅1GB内存
    • 方法一:Bitmap
    • 方法二:布隆过滤器
  • 2.数据统计
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档