为什么亿级数据量时要使用位图?位图和布隆过滤器有什么关系?
文章目录
- 一、为什么要使用位图
- 二、什么是位图
- 三、布隆过滤器
- 四、位图的常见使用场景
- 4.1 生成看似无规律却呈趋势递增的号段式ID
- 4.2 搜索引擎爬虫网页去重
- 4.3 大型网站每天UV数量统计
- 五、结语
一、为什么要使用位图
我们先来看一个问题,假设我们有1千万个不同的整数需要存储,每个整数的大小范围是1到1亿。然后,给定任意一个整数X,我们需要判断X是否在刚才的1千万个整数内。这个问题该如何处理呢?
常规的做法肯定就是先考虑如何存储这1千万个整数,在Java中,int类型是4个字节,可以表示的范围区间是-2147483648~2147483647,所以每个整数都用int来表示是可行的。那么1千万个整数需要占用多少内存空间呢?两者相乘就是了,应该是4000万字节,也就是40MB。
而且如果我们存放的整数是是一亿个,每个整数大小范围是1到100亿怎么办?占用的内存空间将会是非常巨大的,是普通的计算机或者手机不能接受的。
所以我们需要使用位图这种数据结构来大大节省内存的使用量。
二、什么是位图
我们知道Byte表示字节,一个字节等于8bit,这里的bit就和位图有关系。在上面的例子中,我们不是要存放1千万个整数嘛,那就申请一个具有1千万个bit的数组,用每个bit(二进制位)来表示一个整数,当前bit为0表示不存在这个整数,为1表示该整数就存在。
虽然数量是1千万个,但是每个数的范围是1到1亿,所以我们需要1亿个bit,换算下来,就是12.5MB,和刚才的40MB相比,节省的不是一点点。
三、布隆过滤器
位图也不是万能的,倘若我们需要存放的1千万个整数的范围是1到100亿怎么办,按道理说,我们申请一个包含100亿个bit的数组就可以了,也是需要1.25GB,太大了,这也是很多电脑和手机承受不起的,那怎么办呢?
布隆过滤器就是让我们有办法在原来12.5MB的内存空间下,使用1亿个bit来存放原本需要100亿个bit才能解决的问题。我们的核心思想就是使用hash函数,把1到100亿大小的数值映射到1到1亿个bit内。
但是这肯定会造成冲突的,鸽巢理论就告诉过我们这一点了。那我们就使用多个不同的hash函数,来把同一个值映射到1到1亿bit中的不同位置上,如此,我们使用多个bit的值来表示一个数值是否存在。对于两个不同的数值来说,经过同一个hash处理得到的值可能会冲突,但是经过多个hash处理得到的多个值就不太可能全部冲突的。
上图:布隆过滤器的工作原理
当我们将某个整数放到内存中时,把它所有hash出来的bit都置为1;当我们需要判断给定的整数X是否已经存在时,就去读取所有的hash出来的bit值,只要有一个不是1,那么就说明这个值不存在;
但是如果所有hash出来的bit值都是1,也不能一定说明这个值X就是已经存在的,布隆过滤器会对结果为存在的情况发生误判。
上图:布隆过滤器发生误判的场景示意
当我们加入的数据越来越多,位图中为0的bit越来越少的时候,布隆过滤器发生误判的概率就会越来越高了。假设我们能提前知道总共有多少数据和数据的范围,我们可以通过调整hash函数的个数、位图的大小来减小误判发生的概率;假设我们并不能提前知道这些,那我们的位图就需要支持自动扩容,当为0的bit小于某个阈值的时候,我们就应该触发扩容位图的操作。
布隆过滤器在对某些可以容忍小概率误判的业务场景非常有效。
四、位图的常见使用场景
4.1 生成看似无规律却呈趋势递增的号段式ID
4.2 搜索引擎爬虫网页去重
4.3 大型网站每天UV数量统计
五、结语
下一篇会实战使用位图来实现抖音号、淘淘号等需要生成看似无规律却呈趋势递增的号段式ID。
为什么亿级数据量时要使用位图?位图和布隆过滤器有什么关系?相关推荐
- Mongodb亿级数据量的性能测试zz
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...
- Mongodb亿级数据量的性能测试比较完整收藏一下
原文地址: http://www.cnblogs.com/lovecindywang/archive/2011/03/02/1969324.html 进行了一下Mongodb亿级数据量的性能测试,分别 ...
- Mongodb亿级数据量的性能测试
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...
- mongodb每秒写入量_Mongodb亿级数据量的性能测试
进行了一下Mongodb亿级数据量的性能测试,分别测试如下几个项目: (所有插入都是单线程进行,所有读取都是多线程进行) 1) 普通插入性能 (插入的数据每条大约在1KB左右) 2) 批量插入性能 ( ...
- 千亿级数据量的Kafka深度实践
来自:DBAplus社群 本文根据严锁鹏老师在[2019 DAMS中国数据智能管理峰会]现场演讲内容整理而成. 讲师介绍 严锁鹏,奇虎360大数据架构运维专家,具有10年基础架构与大数据开发经验.20 ...
- 360 千亿级数据量的 Kafka 深度实践
讲师介绍 严锁鹏,奇虎360大数据架构运维专家,具有10年基础架构与大数据开发经验.2013年加入360商业化团队,负责消息中间件开发与运维,同时涉及大数据架构.微服务架构.实时计算平台.机器学习平台 ...
- 挨踢部落直播课堂第十期:亿级数据量高并发下数据库水平切分的结构设计
转自:http://tn.51cto.com/article/373 内容介绍 1.大数据量时,数据库架构设计原则 2.数据库水平切分架构设计方向 3.用户中心,帖子中心,好友中心,订单中心水平切分架 ...
- MySQL亿级数据量实时同步,小米如何完美hold住
点击上方"朱小厮的博客",选择"设为星标" 后台回复"1024"获取公众号专属1024GB资料 作者丨刘心光 来源丨小米云技术(ID:mi- ...
- 亿级数据量场景下,如何优化数据库分页查询方法?
摘要:刷帖子翻页需要分页查询,搜索商品也需分页查询.当遇到上千万.上亿数据量,怎么快速拉取全量数据呢? 本文分享自华为云社区<大数据量性能优化之分页查询>,作者: JavaEdge. 刷帖 ...
最新文章
- layui 导航收缩代码_pycharm的十个小技巧,让你写代码效率翻倍
- 一文读懂阿里云数据库Autoscaling是如何工作的
- android 按钮中断,android – 如何“中断”在AccessibilityService中执行的操作?
- 线性代数、概率 入门书籍推荐
- Java高级语法笔记-普通异常处理
- Deep Learning快速学习方法
- python用模块读取xml文件_Python之xml文档及配置文件处理(ElementTree模块、ConfigParser模块)...
- c51汇编语言extrn data,ASM51调用C51函数的实现
- AT88SC104 加密认证过程
- gatedata graph digitier 基本使用
- Java_键盘输入语句
- maven安装及配置(详细版)
- 如何判断本地(路由器)分配的IP是否是公网IP?
- 系统安装:双系统启动菜单
- 办公室常见问题解决:不能连接局域网的共享打印机
- onnx优化系列 - 获取中间Node的inference shape的方法
- B站入局直播电商,流量的终点就是带货?
- Carrying Conundrum CodeForces - 1567C
- 惯性传感器阵列导航模块OSMIUM MIMU4X9C/4X4C介绍
- 手把手教你使用Newstart HA
热门文章
- create-react-app :无法加载文件 C:\Users\Administrator\AppData\Roaming\npm\create-react-app.ps1,因为在此系统上禁止运行
- 【今日学长】来自柚子帮学长--什么?这几家伦敦的餐厅你还没吃过?
- 2018年美亚杯电子数据取证大赛-团体赛
- Android:高仿百度外卖、美团、淘点点二级联动效果!
- android 手机usb 驱动安装
- 甜品消消乐知识点总结
- 家谱树(gentree)
- 试题 算法训练 猴子分苹果
- 互联网常用的网络用语
- 极客爱情 2.0.1| 从你的编程世界路过