布隆过滤器:极简存储,高效检索

news2024/12/28 2:54:25

引言

在海量数据的存储与检索中,如何在保持快速检索的同时,降低内存占用是个巨大的挑战。有没有一种既能快速检索又能节省内存的方案?布隆过滤器(Bloom Filter)就是这样一种数据结构。

布隆过滤器的基本原理

如果我们要判断某个元素是否在集合中,最直接的方式是保存集合中所有元素,然后通过遍历集合来查找。但是,当集合中的数据量变得非常大时,像数组、链表、哈希表等传统数据结构不仅需要大量存储空间,查找效率也会随之下降。

9a9882001f3a9f11f8b19acd89c870c7.jpeg

注意到对散列表来说,查找的复杂度非常低。

当往数组或列表中插入新数据时,将不会根据插入的值来确定其索引值。这意味着新插入的索引值与数据值之间没有直接关系。

哈希表可以通过对 “值” 进行哈希处理来获得该值对应的索引值,然后把该值存放到对应的索引位置。这意味着索引值是由插入项的值所确定的,当你需要判断列表中是否存在该值时,只需要对值进行哈希处理并在相应的索引位置进行搜索即可,这时的搜索速度是非常快的[1]

65e3b4be7b1f8e03b016d533a3a6d0f0.jpeg

然而随着数据量的增加,哈希表所需的内存也急剧增加。

举例来说,假设有 10 亿条网址数据,每条网址占 64 字节,使用哈希表大约需要 64GB 内存,甚至更多。

在这种场景下,我们需要一种更为精简的结构来替代哈希表。

布隆过滤器就是这样一种节省空间且检索速度快的数据结构。它可以在不完全存储数据的情况下,通过少量空间来判断某个元素是否可能存在于集合中。

布隆过滤器(Bloom Filter)本质上是一个长度为 m 的位数组,最初所有的值均设置为 0(此处以m=10为例)。

当需要将某个元素加入布隆过滤器时,使用 K 个不同的哈希函数(此处以k=3为例)将该元素映射到数组的 K 个位置,并将对应的位设为 1。

8fda1b452595a3aaca67693710225558.jpeg

现在我们要将字符串 "6226" 存入布隆过滤器。经过 3 个哈希函数处理后,分别得到索引值 2、5、9,这些位置上的值将被设置为 1。

1e67c5b374a3713b32225ce7772f494f.jpeg

接着,我们再存入字符串 "6227"。哈希函数处理后,索引值为 1、6、9,这些位置上的值同样会被设置为 1。

b2d226219fc0ac8b8c527d0707b44c64.jpeg

这个过程重复多次将数据都放进去。

当查询一个数据是否存在时,算出经过三个hash函数转换并对10取模后的索引值。

看看这些三个位置上的数字是不是都是1就知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不存在;如果都是1,则被检元素很可能在[2]。

布隆过滤器可能出现”存在此元素“的误报现象,但是不会出现”不存在“的漏报现象。

误报现象是因为可能有多个元素经过处理后的索引值相同,导致该位置为 1, 那么一个不存在的元素也可能会被误判为存在。

对于要将n个数据放进一个长度为m的场景,为了尽量降低误报率,数学上有公式计算此场景下最优的哈希函数K的数量。

cbb1b8dbf8cbcc485777429ee03b9ac6.jpeg

布隆过滤器在HBase中的应用

HBase 是大数据领域中常用的分布式数据库系统,能够高效存储和查询数十亿条数据。

它通过分块存储,将表的数据按顺序分为若干数据块,每块内的多个元素都算出一个布隆过滤器串。

通过预先对每个数据块建立一个布隆过滤器,来快速判断某个数据块是否可能包含该数据。如果布隆过滤器判断该数据块不可能包含目标数据,则可以跳过这个数据块,极大减少需要检索的数据块数量,从而加快查询速度。

假设一个数据块大小为 64KB,平均每个 rowkey 占 1KB。在使用 3 个哈希函数的情况下,按照上面的公式布隆过滤器需要的空间大约是80byte。

正是由于布隆过滤器只需占用极小的空间,便可给出“可能存在”和“肯定不存在”的存在性判断,因此可以提前过滤掉很多不必要的数据块。HBase 中的 Get 操作就是依赖于布隆过滤器的快速过滤机制,能够在大规模数据环境下显著提升查询速度[3]。

总结

布隆过滤器作为一种高效、低成本的空间优化方案,凭借其独特的“以小博大”能力,在大数据存储与查询场景中占据了重要地位。通过它的应用,HBase 可以在海量数据中迅速筛选出可能包含目标数据的块,大大提升查询效率。虽然布隆过滤器存在误报风险,但它从不漏报的特性,使其成为实际场景中不可或缺的工具。

在数据量持续增长的今天,布隆过滤器无疑是优化大数据存储与检索的利器,值得每个开发者深入理解并加以应用。

参考

1. 布隆过滤器:你值得拥有的开发利器 https://segmentfault.com/a/1190000021136424
2. 布隆过滤器 https://zh.wikipedia.org/wiki/%E5%B8%83%E9%9A%86%E8%BF%87%E6%BB%A4%E5%99%A8 
3. HBase原理与实践 (数据库技术丛书)_胡争、范欣欣 P119-P120 & P234-P241

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2223895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据库、数据仓库、数据湖和数据中台有什么区别

很多企业在面对数据存储和管理时不知道如何选择合适的方式,数据库、数据仓库、数据湖和数据中台,这些方式都是什么?有什么样的区别?企业根据其业务类型该选择哪一种?本文就针对这些问题,来探讨下这些方式都…

【目标检测01】真实框、预测框、锚框和交并比IoU

文章目录 1. 任务定义2. 基本概念2.1 边界框(bounding box)2.2 真实框、预测框和锚框2.3 交并比 (IoU)2.4 代码实现 1. 任务定义 目标检测的主要目的是让计算机可以自动识别图片或者视频帧中所有目标的类别,并在该目标周围绘制边界框&#x…

【linux网络编程】| 网络基础 | 解析IP与Mac地址的区别

前言:本节内容讲解一些网络基础相关的知识点, 不涉及网络代码!同样的本节内容是作为前一篇的补充知识点, 前一篇文章地址:【linux网络编程】 | 网络基础Ⅰ| 认识网络-CSDN博客,本篇文章内容较少&#xff0c…

命名空间std, using namespace std

命名空间std&#xff0c;using namespace std 在标准C以前&#xff0c;都是用#include<iostream.h>这样的写法的&#xff0c;因为要包含进来的头文件名就是iostream.h。标准C引入了名字空间的概念&#xff0c;并把iostream等标准库中的东东封装到了std名字空间中&#x…

UE5 源码学习 初始化

跟着 https://www.cnblogs.com/timlly/p/13877623.html 学习 入口函数 UnrealEngine\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp WinMain 入口 int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ char* p…

unity开发之可视化制作动画

录制动画 1&#xff09;打开录制动画页面&#xff08;或者按快捷键ctrl6&#xff09; 2&#xff09;选中需要录制动画的对象 3&#xff09;创建动画列表&#xff0c;注意现在还没有录制动画&#xff0c;我这里创建了开门和关门动画列表 4&#xff09;选择需要录制动画的对象的相…

【计网】UDP Echo Server与Client实战:从零开始构建简单通信回显程序

目录 前言&#xff1a; 1.实现udpserver类 1.1.创建udp socket 套接字 --- 必须要做的 socket&#xff08;&#xff09;讲解 代码实现&#xff1a;​编辑 代码讲解&#xff1a; 1.2.填充sockaddr_in结构 代码实现&#xff1a; 代码解析&#xff1a; 1.3.bind sockfd和…

关于在vue2中接受后端返回的二进制流并进行本地下载

后端接口返回&#xff1a; 前端需要在两个地方写代码&#xff1a; 1.封装接口处&#xff0c;responseType: blob 2.接收相应处 download() {if (this.selectionList.length 0) {this.$message.error("请选择要导出的数据&#xff01;");} else {examineruleExport…

【Git】将本地代码提交到github仓库

一、创建仓库 复制这里的HTTP连接码 二、仓库初始化 进入你要提交的代码文件夹 右键选择 Git Bach Here 输入命令 git clone [HTTP连接码] 此时文件夹里会出现一个新的文件夹&#xff0c;将原来的文件当今这个新的文件夹 三、上传代码 执行命令 cd [新文件夹] 将所有文件放…

ArcGIS必会的选择要素方法(AND、OR、R、IN等)位置选择等

今天来看看ArcGIS中的几个选择的重要使用方法 1、常规选择、 2、模糊查询、 3、组合复合条件查询&#xff08;AND、OR、IN&#xff09;&#xff0c; 4、空值NULL查询 5、位置选择 推荐学习&#xff1a; 以梦为马&#xff0c;超过万名学员学习ArcGIS入门到实战的应用课程…

Pandas模块之垂直或水平交错条形图

目录 df.plot() 函数Pandas模块之垂直条形图Pandas模块之水平交错条形图 df.plot() 函数 df.plot() 是 Pandas 中的一个函数&#xff0c;用于绘制数据框中的数据。它是基于 Matplotlib 库构建的&#xff0c;可以轻松地创建各种类型的图表&#xff0c;包括折线图、柱状图、散点…

权重衰减学习

1.权重衰减是最广泛使用的正则化技术之一 %matplotlib inline import torch from torch import nn from d2l import torch as d2l 2.生成数据 n_train, n_test, num_inputs, batch_size 20, 100, 200, 5 true_w, true_b torch.ones((num_inputs, 1)) * 0.01, 0.05 train_dat…

论文笔记:LaDe: The First Comprehensive Last-mile Delivery Dataset from Industry

2023 KDD 1 intro 1.1 背景 随着城市化进程的加快和电子商务的发展&#xff0c;最后一公里配送已成为一个关键的研究领域 最后一公里配送&#xff0c;如图1所示&#xff0c;是指连接配送中心和客户的包裹运输过程&#xff0c;包括包裹的取件和配送除了对客户满意度至关重要外…

《等保测评新视角:安全与发展的双赢之道》

在数字化转型的浪潮中&#xff0c;企业面临的不仅是技术革新的挑战&#xff0c;更有信息安全的严峻考验。等保测评&#xff0c;作为国家网络安全等级保护的一项重要措施&#xff0c;不仅为企业的安全护航&#xff0c;更成为推动企业高质量发展的新引擎。本文将从全新的视角&…

如何用 Spring AI + Ollama 构建生成式 AI 应用

为了构建生成式AI应用&#xff0c;需要完成两个部分&#xff1a; • AI大模型服务&#xff1a;有两种方式实现&#xff0c;可以使用大厂的API&#xff0c;也可以自己部署&#xff0c;本文将采用ollama来构建• 应用构建&#xff1a;调用AI大模型的能力实现业务逻辑&#xff0c;…

mfc之tab标签控件的使用--附TabSheet源码

TabSheet源码 TabSheet.h #if !defined(AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_) #define AFX_TABSHEET_H__42EE262D_D15F_46D5_8F26_28FD049E99F4__INCLUDED_#if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 // TabSheet.h : …

es实现桶聚合

目录 聚合 聚合的分类 DSL实现桶聚合 dsl语句 结果 聚合结果排序 限定聚合范围 总结 聚合必须的三要素&#xff1a; 聚合可配置的属性 DSL实现metric聚合 例如&#xff1a;我们需要获取每个品牌的用户评分的min,max,avg等值 只求socre的max 利用RestHighLevelClien…

【Multisim14.0正弦波>方波>三角波】2022-6-8

缘由有没有人会做啊Multisim14.0-其他-CSDN问答参考方波、三角波、正弦波信号产生 - 豆丁网

arcgis中dem转模型导入3dmax

文末分享素材 效果 1、准备数据 (1)DEM (2)DOM 2、打开arcscene软件 3、加载DEM、DOM数据 4、设置DOM的高度为DEM

【虚幻引擎UE】UE5 音频共振特效制作

UE5 音频共振特效制作 一、基础准备1.插件准备2.音源准备 二、创建共感NRT解析器和设置1.解析器选择依据2. 创建解析器3. 创建解析器设置&#xff08;和2匹配&#xff09;4.共感NRT解析器设置参数调整5.为共感NRT解析器关联要解析的音频和相应设置 三、蓝图控制1.创建Actor及静…