海量数据案例

本文深入探讨了海量数据处理的关键方法,包括哈希、位图、布隆过滤器等技术的应用,通过具体案例如两个大文件中找共同记录、大文件排序去重,展示了分治算法和Bloomfilter在实际场景中的高效解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

这里主要针对案例进行分析讲解,欢迎大家在问题或是直接贡献更多相关的海量数据相关难题。这里我将持续性的更新一些面试中常见的海量数据案例。

这里我将会持续更新,时间有限不能全面总结,欢迎大家一起完善。

海量数据问题处理方法

  • 哈希
  • 位图
  • 布隆过滤器(Bloom Filter)
  • 堆(堆)
  • 双层桶划分
  • 数据库索引
  • 倒排索引(倒置索引)
  • B +树
  • 特里树
  • MapReduce的  

海量数据案例

1.两个大文件中找出共同记录

题目描述

给定a,b两个文件,各存放50亿个url,每个url不占64字节,内存限制是4G,让你找出a,b文件共同的url?

解题思路

方案1

首先我们最常想到的方法是读取文件a,建立哈希表方便后面查找,然后再读取文件b,遍历文件b中每个url,对于每个遍历,我们都执行查找hash表的操作,若哈哈表中搜索到了,则说明两文件共有,存入一个集合。

可以估计每个文件安的大小为5G×64 = 320G,远远大于内存限制的4G。所以不可能将其完全加载到内存中处理。

针对上述问题,我们分治算法的思想。

  1. 遍历文件a,对每个url求取hash(url)%1000,然后根据所取得的值将url分别存储到1000个小文件(记为a0,a1,...,a999每个小文件约300M),为什么是1000?主要根据内存大小和要分治的文件大小来计算,我们就大致可以把320G大小分为1000份,每份大约300M(当然,到底能不能分布尽量均匀,得看哈希函数的设计)

  2. 遍历文件b,采取和a相同的方式将url分别存储到1000个小文件(记为b0,b1,...,b999)

    为什么要这样做?文件a的哈希映射和文件b的哈希映射函数要保持一致,这样的话相同的url就会保存在对应的小文件中,比如,如果a中有一个url记录data1被哈希到了a99文件中,那么如果b中也有相同url,则一定被hash到了b99中。

  所以现在问题转换成了:找出1000对小文件中每一对相同的url(不对应的小文件不可能有相同的url

  1. 求每对小文件中相同的url时,可以把其中一个小文件的url存储到hash_set中。然后遍历另一个小文件的每个url,看其是否在刚才构建的hash_set中,如果是,那么就是共同的url,存到文件里面就可以了。

方案2

如果允许有一定的错误率,可以使用Bloom filter,4G内存大概可以表示340亿位。将其中一个文件中的url使用Bloom filter映射为这340亿位,然后挨个读取另外一个文件的url,检查是否与Bloom过滤器,如果是,那么该你应该是共同的url(注意会有一定的错误率)。

2.大文件排序和去重

如果有一个5​​00G的超大文件,里面都是数值,如何对这些数值排序? - 优快云博客https://blog.youkuaiyun.com/u011381576/article/details/79385133

大文件的排序和去重超级简单的实现 - zero_learner - 博客园 https://www.cnblogs.com/yangxudong/p/3848453.html

参考资料

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值