Go后端场景——海量数据去重

海量数据去重是算法与系统设计面试中比较经典的题目,他核心考察点只有一个:当内存不足以装下所有数据时,如何利用磁盘或特定的数据结构来解决问题。这考察的是你空间换时间或分支思想。

面试的问法通常是:我有100亿个URL(或100G的文件),内存只有4G,如何找出其中重复的URL?

方案一:分治法

这适用于100%精准去重的场景

核心思想

既然100GB装不下,我就把它拆成100个1GB的小文件,而且要保证:相同的URL必须进入同一个小文件。

步骤

哈希取模
  • 遍历大文件中的每一行
  • 计算Hash(URL)%100(假设拆100份)
  • 根据结果,将URL追写到file_0,file_1...file_99中
  • 原理:因为哈希函数的确定性,相同的URL算出来的哈希值一样,因此会放入同一个小文件中。
内存去重
  • 现在有100个小文件,每个大约1G(允许有偏差)
  • 一次将每个小文件读入内存
  • 构建一个HashSet(Go中的map[string]struct{})
  • 遍历小文件,丢进HashSet,如果HashSet已经有了,说明是重复的
合并结果

将去重后的结果输出到最终文件

数据倾斜策略

如果发生数据倾斜,比如file_0拆分后仍然有10G,内存装不下,递归拆分,对这个超大的file_0再换一个哈希算法,继续拆分。


方案二:位图法

如果不是URL,而是40亿个电话号码(QQ号),怎么去重。这时候用Hash分治就太慢了,要上BitMap

方法

普通存法:一个int占4字节,40亿个int占16GB,超出4GB要求。

BitMap存法:一个bit表示一个数字是否存在

  • 第0位是1,代表数字0存在
  • 第100位是1,代表数字100存在
  • 空间占用:40*10^8bits/8≈500MB,进一步的,电话号码在13000000000~19999999999之间,我们只要7000000000位=70*10^8/8≈875MB就可以存下所有手机号
进阶:咆哮位图

如果数据很稀疏(比如只有两个数:1和10亿),BitMap仍然要10亿位,浪费空间。

可以使用Roaring BitMap(Java/Go都有库)。他结合了数组和BitMap。专门处理稀疏数据,Spark、Lucene、Redis都在使用。


方案三:布隆过滤器

如果面试官说:"是 100 亿个 URL,用来做爬虫去重,允许万分之一的误判。"

1. 核心思想

不需要 100% 精准,只要绝大多数重复的能拦住就行。

2. 优势
  • 空间极小:比 BitMap 还省空间(因为 URL 转成 Hash 映射到位图上,允许冲突)。
  • 速度极快:O(1) 复杂度。
3. 致命缺点(面试必考)
  • 误判
    • 它说"不存在",那就一定不存在(绝对可信)。
    • 它说"存在",可能是不存在的(因为 Hash 冲突)。
  • 不可删除 :标准的布隆过滤器不支持删除元素。如果你要支持删除,必须答 布谷鸟过滤器计数布隆过滤器

方案四:前缀树

如果数据是 URLIP 地址 这种有大量公共前缀的字符串。

  • 原理http://www.google.com/ahttp://www.google.com/b 共享前面的路径。
  • 优势:利用 Trie 树存储,既能去重,又能大幅节省内存(相比存完整字符串)。
  • 局限:如果字符串毫无规律(随机哈希值),Trie 树反而更浪费空间。

总结

|----------------------|-----------------------------|----------------------|
| 场景 | 推荐算法 | 核心关键词 |
| 通用、数据量极大、必须精准 | Hash 分治 (分流) | 拆小文件、HashSet、递归拆分 |
| 纯数字 (电话/ID)、必须精准 | BitMap / Roaring BitMap | 位存储、512MB 存40亿数 |
| 允许极低误判 (爬虫/黑名单) | Bloom Filter | 概率型、不支持删除、空间最省 |
| 大量公共前缀 (URL/IP) | Trie Tree | 共享前缀、节省空间 |
| 单机内存足够 | HashSet / HashMap | Go map, Java HashSet |

相关推荐
智者知已应修善业4 小时前
【proteus中lm339电压滞回比较器达到三角波转换成方波】2023-4-13
驱动开发·经验分享·笔记·硬件架构·proteus·硬件工程
恒拓高科WorkPlus6 小时前
私有化视频会议的核心价值在于安全与自主可控
经验分享
其实秋天的枫7 小时前
2025年12月大学英语六级真题及答案电子版pdf三套全
经验分享·pdf
添尹7 小时前
Go语言基础之变量和常量
golang
其实秋天的枫8 小时前
【专四】英语专业四级TEM4历年真题及答案电子版PDF(2009-2025年)
经验分享
其实秋天的枫9 小时前
2025年12月英语六级真题及答案解析完整版(第一、二、三套全PDF)
经验分享·算法
中屹指纹浏览器9 小时前
2026指纹浏览器性能瓶颈分析与优化技巧
经验分享·笔记
优化控制仿真模型10 小时前
2026年最新驾考科目一考试题库2309道全。电子版pdf
经验分享·算法·pdf
上海曼博生物医药科技有限公司10 小时前
Biolaminin 521在MSCs培养中的应用:从原代扩增到iMSC分化的关键基质解析【曼博生物】
经验分享·业界资讯·细胞培养·biolamina·ln521·层粘连蛋白
探索宇宙真理.11 小时前
SiYuan SQL漏洞 | CVE-2026-29073复现&研究
数据库·经验分享·sql·eureka·安全漏洞·siyuan