Skip to main content

Command Palette

Search for a command to run...

海量数据去重

Published
1 min read

起因

有个哥们,有 5000G 数据需要去重。

这么大数据其实挺不好处理的,尤其是超不注意就内存/磁盘炸裂。

所以,如何做到性能、内存、磁盘之间的平衡,就是这个问题的难题……

其实这个问题让我想起「编程珠玑」中的一篇内容……

方案

刚开始大家觉得使用使用 redis 的 hash 能力来处理,set/hash 都可以,但是不管是直接丢字符串,还是将字符串 hash 计算后存储,其实都会比较耗费内存。并且 hash 后的数据还会存在一定概率 hash 碰撞,此时更不好处理了。

于是在我们小群里面进行了一些讨论……

于是大家纷纷出招:

  • 磁盘换内存式的 kv 数据库(例如 leveldb、boltdb)
  • redis 布隆过滤器(布隆过滤器内部也是用的 bitmap,关键)
  • redis bitmap
  • mapReduce

其实都会有一些优缺点吧。

  • 磁盘式 kv db 性能不太行,同时读写磁盘可能会炸裂
  • redis 布隆过滤器的话 存在误差,毕竟 「存在的不一定存在,不存在的一定不存在……」
  • redis bitmap 如上,存在一定误差,毕竟还是会有撞库的可能
  • mapReduce 好像有大炮打蚊子的感觉……

ok,最终因为忙工作,也没细想这个问题了,反正也是嘴炮一番,这事就过了。

几天之后……

过了几天看到哥们发了几篇布隆过滤器的文章,然后怎么还在研究这事。

此时刚好在上班的路上,又重新想了想这个方案。

因为之前公司的产品中有同事提出使用布隆过滤器的「存在则可能存在」的特性做一个减少检索范围的筛选器。

所以恰好好像可以反过来想想,此时方案流程可以是这样:

  1. 利用布隆过滤器「不存在则一定不存在」的特性
  2. 例如
    1. 传入「张三」
      1. 不存在
        1. 并标记到「存储器」中(如果为了省内存,其实也可以使用安全 hash 算法进行计算后存入)
      2. 存在
        1. 从「存储器」中拿到撞库的字符串列表
          1. 进行暴力匹配
          2. 并将「张三」存入布隆过滤器,也就是上面撞库的字符串列表中
  3. 重复上面的步骤。

上面说的「存储器」是什么呢?

  • 可以是磁盘 kvdb
  • 可以是 redis 内存 set/hash
    • 如果重复字符串是低概率的事情才可以这么做,否内存炸裂

在「进行暴力匹配」这步骤中的问题

如果重复是大概率的事情,那么暴力匹配的耗时会非常多,变成一个 (O)n 的搜索,性能急剧下降。

此时有点像普通的二叉树,搜索匹配可能变成一个「链表」。

针对这种问题,可以做一些改进:

  1. 直接存入磁盘 kvdb
  2. 将字符串通过 安全 hash 算法计算成数字存入 redis bitmap/hash
    1. 对字符串进行 hash 的目的是降低内存占用

然而

然而哥们直接用了布隆过滤器的「不存在一定不存在」的特性直接「粗」过滤了。

所以……还是水一篇博客吧。

49 views

More from this blog

会有越来的多的side projects出现

什么是side project 可以理解为工作之余开发的产品,通常是收费的服务,可作为工作之外额外收入的产品。 在目前经济下行、公司开源节流(裁员)、失业率上升的大环境下,每一个程序员都应该拥有自己的side projects来对冲未来的不可靠风险。 所以side project 不仅仅是多一种「被动收入」,他也是你未来的「筹码」——工作累了,不想干了、有小孩了、买房了、家人生病了等等这些事情发生的时候,你可以「任性」一下。 而不是一些不可靠的风险出现的时候,再来提高自己的「抗风险」能力。 上面...

Jul 28, 20231 min read61

Xbox Cloud Gaming 游戏加速尝试

Xbox Cloud Gaming 游戏加速 之前有个很老的xbox游戏机,因为性能有点差劲了,所以卖了。 偶尔还是想玩玩游戏,但是老婆不让给买xbox的物理机(怀恋单身),所以含泪玩xbox cloud gaming(以下简称 xcg),xpg会员游戏还是很丰富的。 于是买了uu加速器,坦白说uu加速器不算便宜的,但是xcg在晚上高峰期,一样卡得怀疑人生,那种被马赛克糊满脸的感受,上一次这种体验还是看小姐姐的电影。 其实用uu加速器玩是ok的,就是国内的网络情况大家都知道,dddd(懂得都懂)...

Sep 5, 20221 min read258

github codespaces 在ipad上的最佳浏览器

Github Codespaces github codespaces 是github在被微软收购后,提供的一款在线web IDE,基本与vscode一致,只是运行在浏览器上而已。 而且非常土豪的提供了4核8G内存,微软就是壕。 so,通过ipad来使用codespaces就是一件比较顺其自然的事。 可是其实也没那么简单。。 IPad使用codespaces的快捷键问题 其实最大的问题就是快捷键的问题,不管你是用saferi,还是chrome,他们提供的快捷键或多或少会与你的vscode的快捷键...

Oct 8, 20211 min read59

基于binlog检查数据错误

起因 某个表的 status 「莫名其妙」变成 0 了 其实可以判断出是 status 没有被赋值,通常是结构体的 status 默认是 0 才会被插入数据库。 于是问题看起来就很简单了:只要检查相关的更新操作中的 status 字段有没有被赋值即可。 但是 这个表是用户表。 因为历史原因,源码中的更新函数很多 调用更新函数的地方也很多 无法复现该问题,测试人员也不知道做了什么操作状态变成 0 的 所以同事关注这个问题挺久了,也没看到问题原因(当然我也没看到……) 但是恰好我在做导出 bin...

Aug 5, 20212 min read61
M

Moli'blog

64 posts

曾经的少年还在吗?