关闭

青桃传媒

全国

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

青桃传媒·2025-03-13 16:41:57·阅读

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

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

参考链接:/post/…

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

方法一:

首先介绍下什么是位图

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

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

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

实现步骤

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

//初始化长度为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的位置就是去重后的结果了

方法二:布隆过滤器

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

实现方案

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

# 初始化过滤器(容量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为偏移存储到中

加载中~

你可能感兴趣的