内存受限场景下从2000GB文本数据提取Top10高频词面试题
大文本Top10高频单词解决方案(内存受限场景)
核心思路:分治+局部统计+全局合并
面对内存远小于数据量的场景,不能一次性加载全量数据,必须通过分治策略把大问题拆解成小问题逐个解决,再合并结果。
第一步:哈希分桶拆分数据
- 遍历2000GB原始数据,对每个单词计算哈希值,根据哈希值将单词分配到N个临时文件(桶)中。核心逻辑是:相同单词必然进入同一个桶,同时要控制每个桶的大小不超过2GB(比如分1000个桶,平均每个桶约2GB,刚好适配内存)。
- 针对所有单词仅出现一次的极端情况:分桶后每个桶内的单词数量是总单词数/分桶数,按平均每个单词10字节计算,2000GB数据约200亿个单词,分1000桶后每个桶仅2000万条数据,每条存单词+计数1,内存完全能承载(2000万条数据仅约400MB)。
第二步:局部统计每个桶的Top10
- 逐个加载临时桶文件到内存,用
HashMap统计桶内每个单词的出现次数。 - 统计完成后,用**小顶堆(优先队列)**维护当前桶的Top10:遍历HashMap键值对,堆大小不足10时直接加入;堆大小为10时,若当前单词频率大于堆顶元素频率,则弹出堆顶、加入当前单词。每个桶处理完仅保留10条数据,内存占用极低。
第三步:全局合并所有桶的Top10
- 收集所有桶的Top10结果(最多1000*10=10000条数据,完全适配内存)。
- 再次用小顶堆对这10000条数据做全局筛选,最终得到全量数据的Top10高频单词。
方案优势(针对极端场景)
- 哈希分桶把海量唯一单词分散到多个小文件,每个文件大小可控,不会超出内存上限。
- 局部统计时,每个桶的HashMap仅存储桶内单词,极端场景下内存压力也在可控范围。
- 后续合并仅处理少量数据,完全不存在内存溢出风险。
额外优化建议
- 预处理:统一单词大小写、去除标点,避免"Hello"和"hello"被误判为不同单词。
- 分桶数量动态调整:根据剩余内存灵活增减分桶数,确保每个桶能被完整加载。
- IO优化:批量写入临时文件减少IO次数,使用SSD存储提升分桶和读取速度。
内容的提问来源于stack exchange,提问作者Kabir Sharma
相关产品推荐
相关产品推荐

