没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
大数据量,海量数据 处理方法总结
大数据量的问题是很多面试笔试中经常出现的问题,比如 baidu google 腾讯 这样的一些涉及
到海量数据的公司经常会问到。
下面的方法是我对海量数据的处理方法进行了一个一般性的总结,当然这些方法可能并不能完全
覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到 的问题。下面的一些问题
基本直接来源于公司的面试笔试题目,方法不一定最优,如果你有更好的处理方法,欢迎与我讨
论。
1.Bloom filter
适用范围:可以用来实现数据字典,进行数据的判重,或者集合求交集
基本原理及要点:
对于原理来说很简单,位数组+k 个独立 hash 函数。将 hash 函数对应的值的位数组置 1,查找时
如果发现所有 hash 函数对应位都是 1 说明存在,很明显 这个过程并不保证查找的结果是 100%
正确的。同时也不支持删除一个已经插入的关键字,因为该关键字对应的位会牵动到其他的关键
字。所以一个简单的改进就 是 counting Bloom filter,用一个 counter 数组代替位数组,就
可以支持删除了。
还有一个比较重要的问题,如何根据输入元素个数 n,确定位数组 m 的大小及 hash 函数个数。
当 hash 函数个数 k=(ln2)*(m/n)时错误率最小。 在错误率不大于 E 的情况下,m 至少要等于
n*lg(1/E)才能表示任意 n 个元素的集合。但 m 还应该更大些,因为还要保证 bit 数组里至少一
半为 0,则 m 应该>=nlg(1/E)*lge 大概就是 nlg(1/E)1.44 倍(lg 表示以 2 为底的对数)。
举个例子我们假设错误率为 0.01,则此时 m 应大概是 n 的 13 倍。这样 k 大概是 8 个。
注意这里 m 与 n 的单位不同,m 是 bit 为单位,而 n 则是以元素个数为单位(准确的说是不同元
素的个数)。通常单个元素的长度都是有很多 bit 的。所以使用 bloom filter 内存上通常都是
节省的。
扩展:
Bloom filter 将集合中的元素映射到位数组中,用 k(k 为哈希函数个数)个映射位是否全 1 表
示元素在不在这个集合中。Counting bloom filter(CBF)将位数组中的每一位扩展为一个
counter,从而支持了元素的删除操作。Spectral Bloom Filter(SBF)将其与集合元素的出现
次数关联。SBF 采用 counter 中的最小值来近似表示元素的出现频率。
问题实例:给你 A,B 两个文件,各存放 50 亿条 URL,每条 URL 占用 64 字节,内存限制是 4G,让
你找出 A,B 文件共同的 URL。如果是三个乃至 n 个文 件呢?
根据这个问题我们来计算下内存的占用,4G=2^32 大概是 40 亿*8 大概是 340 亿,n=50 亿,如果
按出错率 0.01 算需要的大概是 650 亿个 bit。现在可用的是 340 亿,相差并不多,这样可能会
使出错率上升些。另外如果这些 urlip 是一一对应的,就可以转换成 ip,则大大简单了。
2.Hashing
适用范围:快速查找,删除的基本数据结构,通常需要总数据量可以放入内存
基本原理及要点:
hash 函数选择,针对字符串,整数,排列,具体相应的 hash 方法。
碰撞处理,一种是 open hashing,也称为拉链法;另一种就是 closed hashing,也称开地址法,
opened addressing。
扩展:
d-left hashing 中的 d 是多个的意思,我们先简化这个问题,看一看 2-left hashing。2-left
hashing 指的是将一个哈希表分成长度相等的两半,分别叫做 T1 和 T2,给 T1 和 T2 分别配备一
个哈希函数,h1 和 h2。在存储一个新的 key 时,同 时用两个哈希函数进行计算,得出两个地址
h1[key]和 h2[key]。这时需要检查 T1 中的 h1[key]位置和 T2 中的 h2[key]位置,哪一个 位置
已经存储的(有碰撞的)key 比较多,然后将新 key 存储在负载少的位置。如果两边一样多,比
如两个位置都为空或者都存储了一个 key,就把新 key 存储在左边的 T1 子表中,2-left 也由此
而来。在查找一个 key 时,必须进行两次 hash,同时查找两个位置。
问题实例:
1).海量日志数据,提取出某日访问百度次数最多的那个 IP。
IP 的数目还是有限的,最多 2^32 个,所以可以考虑使用 hash 将 ip 直接存入内存,然后进行统
计。
3.bit-map
适用范围:可进行数据的快速查找,判重,删除,一般来说数据范围是 int 的 10 倍以下
基本原理及要点:使用 bit 数组来表示某些元素是否存在,比如 8 位电话号码
扩展:bloom filter 可以看做是对 bit-map 的扩展
问题实例:
1)已知某个文件内包含一些电话号码,每个号码为 8 位数字,统计不同号码的个数。
8 位最多 99 999 999,大概需要 99m 个 bit,大概 10 几 m 字节的内存即可。
2)2.5 亿个整数中找出不重复的整数的个数,内存空间不足以容纳这 2.5 亿个整数。
将 bit-map 扩展一下,用 2bit 表示一个数即可,0 表示未出现,1 表示出现一次,2 表示出现 2
次及以上。或者我们不用 2bit 来进行表示,我们用两 个 bit-map 即可模拟实现这个 2bit-map。
剩余6页未读,继续阅读
资源评论
ischarles
- 粉丝: 16
- 资源: 10
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 8021X-2020.pdf
- Screenshot_2024-10-12-01-45-58-260_coding.yu.ccompiler.new.jpg
- 示波器实验报告,实验目的:掌握使用示波器和信号发生器的基本方法
- 示波器实验项目方案及报告(使用示波器观察与分析RC电路充放电过程).doc
- 易支付源代码易支付源代码易支付源代码易支付源代码易支付源代码易支付源代码易支付源代码易支付源代码
- 基于Jupyter Notebook的joyful-pandas数据分析与可视化设计源码
- 基于Java语言开发的智慧自助餐饮系统后端设计源码
- 基于若依框架的Java报修系统设计源码
- 基于Java和Kotlin的永州特产溯源系统设计源码
- 基于Java与Kotlin的居家生活交流社区SmallNest设计源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功