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

引言

在海量数据的存储与检索中,如何在保持快速检索的同时,降低内存占用是个巨大的挑战。有没有一种既能快速检索又能节省内存的方案?布隆过滤器(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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue.js 学习总结(11)—— Vue3 Hook 函数实战总结

前言 在 Vue 3 中,Hook 函数是一种特殊的函数,用于封装可重用的逻辑和状态管理。Hook 函数允许你在 Vue 组件中提取和复用逻辑,而不是将所有逻辑都放在组件的选项对象中。它们可以帮助你更好地组织代码,提高代码的可维护性和可测…

算法题总结(十九)——图论

图论 DFS框架 void dfs(参数) { if (终止条件) {存放结果;return; }for (选择:本节点所连接的其他节点) {处理节点;dfs(图,选择的节点); // 递归回溯,撤销处理结果 } }深搜三部曲 确认递归函数,参数确认终止条件处理目前搜索节…

JAVA基础:IO流 (学习笔记)

IO流 一,IO流的理解 i : input 输入 o:output 输入 流:方式,传递数据的方式---------相当于生活中的“管道”,“车”,将资源从一个位置,传递到另一个位置 二,IO流的分…

从0开始深度学习(16)——暂退法(Dropout)

上一章的过拟合是由于数据不足导致的,但如果我们有比特征多得多的样本,深度神经网络也有可能过拟合 1 扰动的稳健性 经典泛化理论认为,为了缩小训练和测试性能之间的差距,应该以简单的模型为目标,即模型以较小的维度的…

Qt中使用线程之QConcurrent

QConcurrent可以实现并发,好处是我们可以不用单独写一个类了,直接在类里面定义任务函数,然后使用QtConcurrent::run在单独的线程里执行一个任务 1、定义一个任务函数 2、定义1个QFutureWatcher的对象,使用QFutureWatcher来监测任…

新手直播方案

简介 新手直播方案 ,低成本方案 手机/电脑 直接直播手机软件电脑直播手机采集卡麦电脑直播多摄像机 机位多路采集卡 多路麦加电脑(高成本方案) 直播推流方案 需要摄像头 方案一 :手机 电脑同步下载 网络摄像头 软件&#xff08…

【学术论文投稿】Windows11开发指南:打造卓越应用的必备攻略

【IEEE出版南方科技大学】第十一届电气工程与自动化国际会议(IFEEA 2024)_艾思科蓝_学术一站式服务平台 更多学术会议论文投稿请看:https://ais.cn/u/nuyAF3 目录 引言 一、Windows11开发环境搭建 二、Windows11关键新特性 三、Windows11设计指南 …

小程序开发实战:PDF转换为图片工具开发

目录 一、开发思路 1.1 申请微信小程序 1.2 编写后端接口 1.3 后端接口部署 1.4 微信小程序前端页面开发 1.5 运行效果 1.6 小程序部署上线 今天给大家分享小程序开发系列,PDF转换为图片工具的开发实战,感兴趣的朋友可以一起来学习一下&#xff01…

linux中级(NFS服务器)

NFS:用于在NNIX/Linux主机之间进行文件共享的协议 流程:首先服务端开启RPC服务,并开启111端口,服务器端启动NFS服务,并向RPC注册端口信息,客户端启动RPC,向服务器RPC服务请求NFS端口&#xff0…

anaconda 创建环境失败 解决指南

anaconda 创建环境失败 解决指南 一、问题描述 我在宿舍有一台电脑。由于我经常泡在实验室,所以那台电脑不是经常用,基本吃灰。昨天晚上突然有在那台电脑上使用Camel-AI部署多智能体协同需求,便戳开了电脑,问题也随之而来。 当…

汽车级DC-DC转换器英飞凌TLF35584

上汽荣威都在用的汽车级DC-DC转换器英飞凌TLF35584 今天平台君从IPBrain数据库中给大家带来的一款由Infineon(英飞凌)推出的一款多路输出安全电源芯片,具备高可靠性和安全性。适用于汽车电子系统中的多种应用场景,如车身控制、安全气囊、防抱死制动系统,电子稳定控制系统等。…

设计模式基础知识以及典型设计模式总结(上)

1. 基础 1. 什么是设计模式? 设计模式是指在软件开发中,经过验证的,用于解决在特定环境下重复出现的特定问题的解决方案。 简单的说,设计模式是解决问题的固定套路。 慎用设计模式。 2. 设计模式是怎么来的? 满足…

Unity3D学习FPS游戏(4)重力模拟和角色跳跃

前言:前面两篇文章,已经实现了角色的移动和视角转动,但是角色并没有办法跳跃,有时候还会随着视角移动跑到天上。这是因为缺少重力系统,本篇将实现重力和角色跳跃功能。觉得有帮助的话可以点赞收藏支持一下!…

fmql之Linux RTC

模拟i2c&#xff0c;连接rtc芯片。 dts&#xff1a; /{ // 根节点i2c_gpio: i2c-gpio {#address-cells <1>;#size-cells <0>;compatible "i2c-gpio";// MIO56-SDA, MIO55-SCL // 引脚编号gpios <&portc 2 0&portc 1 0 >;i2c-gp…

Unity3D学习FPS游戏(2)简单场景、玩家移动控制

前言&#xff1a;上一篇的时候&#xff0c;我们已经导入了官方fps的素材&#xff0c;并且对三维模型有了一定了解。接下来我们要构建一个简单的场景让玩家能够有地方移动&#xff0c;然后写一个简单的玩家移动控制。 简单场景和玩家移动 简单场景玩家移动控制玩家模型视野-摄像…

单细胞配色效果模拟器 | 简陋版(已有颜色数组)

目的&#xff1a;假设你有一组颜色了&#xff0c;怎么模拟查看它们在单细胞DimPlot中的美学效果呢&#xff1f;要足够快&#xff0c;还要尽可能有模拟效果。 1. 尝试1: 随机矩阵&#xff0c;真的UMAP降维后绘图&#xff08;失败&#xff09; 造一个随机矩阵&#xff0c;使用S…

华为鸿蒙HarmonyOS应用开发者高级认证视频及题库答案

华为鸿蒙开发者高级认证的学习资料 1、课程内容涵盖HarmonyOS系统介绍、DevEco Studio工具使用、UI设计与开发、Ability设计与开发、分布式特性、原子化服务卡片以及应用发布等。每个实验都与课程相匹配&#xff0c;帮助加深理解并掌握技能 2、学习视频资料 华为HarmonyOS开发…

全能大模型GPT-4o体验和接入教程

GPT-4o体验和接入教程 前言一、原生API二、Python LangchainSpring AI总结 前言 Open AI发布了产品GPT-4o&#xff0c;o表示"omni"&#xff0c;全能的意思。 GPT-4o可以实时对音频、视觉和文本进行推理&#xff0c;响应时间平均为 320 毫秒&#xff0c;和人类之间对…

动态规划 —— 斐波那契数列模型-解码方法

1. 解码方法 题目链接&#xff1a; 91. 解码方法 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/decode-ways/description/ 2. 题目解析 1. 对字母A - Z进行编码1-26 2. 11106可以解码为1-1-10-6或者11-10-6, 但是11-1-06不能解码 3. 0n不能解码 4. …

微知-Lecroy力科的PCIe协议分析仪型号命名规则(PCIe代,金手指lanes数量)

文章目录 要点主要型号命名规则各代主要产品图片Summit M616 协议分析仪/训练器Summit T516 分析仪Summit T416 分析仪Summit T3-16分析仪Summit T28 分析仪 综述 要点 LeCroy(力科)成立于1964年&#xff0c;是一家专业生产示波器厂家。在美国纽约。一直把重点放在研制改善生产…