亿级id去重


前言

对于一个存放着一亿条id数据的文件,如何去掉文件内部重复的id。

解决方案

1.通过HashSet解决:

因为HashSet里面的元素不能重复。所以可以将文件里的id数据逐一添加到HashSet中完成去重。但是要注意这种解决方法只适用于系统内存足够的情况下,否则还没等数据全部添加进去就报内存溢出错误了。

2.通过MySQL解决:

在MySQL中建立一张表,表的字段只有id,给该字段添加UNIQUE约束(该约束可以保证某列的每行必须有唯一的值)。然后读取文件中的数据添加进数据库完成去重。

对于操作数据库耗时太久的解决:

  1. 批量插入:一次插入多行数据,而不是逐行插入。这可以显著减少网络往返时间和数据库的锁定时间。
  2. 并行处理:使用多线程或多进程并行插入数据。

3.通过Redis解决

Redis中也存在Set类型的数据结构。可以将文件中的id数据写入Redis完成去重。但是该种解决方法也只适用于内存允许的情况下。

4.通过布隆过滤器解决

如果允许存在一定误判率的情况下,可以使用布隆过滤器解决。布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在于海量数据中。我们可以把它看作由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。相比于我们平时常用的 List、Map、Set 等数据结构,它占用空间更少并且效率更高,但是缺点是其返回的结果是概率性的,而不是非常准确的。理论情况下添加到集合中的元素越多,误报的可能性就越大。并且,存放在布隆过滤器的数据不容易删除。

Bloom Filter 会使用一个较大的 bit 数组来保存所有的数据,数组中的每个元素都只占用 1 bit ,并且每个元素只能是 0 或者 1(代表 false 或者 true),这也是 Bloom Filter 节省内存的核心所在。这样来算的话,申请一个 100w 个元素的位数组只占用 1000000Bit / 8 = 125000 Byte = 125000/1024 KB ≈ 122KB 的空间。
添加数据进布隆过滤器示意图如下:
在这里插入图片描述

使用三个哈希函数的目的是为了减少误判率。只有三个哈希函数的值均为1才能说明该数据已经存在了。

具体是这样做的:将文件中的id数据逐条读入存放在布隆过滤器中。当id数据过来,首先判断该id值是否存在于布隆过滤器。不存在的话说明该id值在读取的id集合中是唯一的,然后将该id添加进布隆过滤器;如果存在的话说明该id值已经存在了,直接在文件中删除该id记录。读取完成后,文件中剩余的id数据就没有重复的了。
使用布隆过滤器解决该问题流程如下:
大致流程如图所示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值