布隆过滤器的压缩

news/2024/4/24 18:09:12/文章来源:https://blog.csdn.net/m0_61567378/article/details/130353439

优点与缺点

优点

布隆过滤器的压缩有以下优点:

  • 减少存储空间:布隆过滤器的基本结构是一个比特数组。如果使用传统的方式来表示比特数组,会占用大量的存储空间。当元素数量和误判率比较少的情况下,这样比特数组会占用过多的存储空间。而对比特数组进行压缩可以大幅减少存储空间的使用。

  • 方便传输:在网络传输或者磁盘存储时,压缩布隆过滤器可以减少数据传输的时间和带宽占用,有助于提高程序的性能。

  • 加速查询:压缩布隆过滤器可以减少读取数据的时间,提高查询的速度。在大规模数据查询的场景下,将布隆过滤器进行压缩可以显著提高查询速度。

缺点

  • 压缩和解压缩的计算开销:压缩和解压缩布隆过滤器需要进行额外的计算,这会增加一定的计算开销。如果需要对大规模的布隆过滤器进行压缩和解压缩,则可能会影响查询的性能。

  • 压缩后的误判率可能会发生变化:在对布隆过滤器进行压缩后,误判率可能会发生变化。因此,需要在设计布隆过滤器时充分考虑到压缩对误判率的影响,并根据实际需求来选择适当的误判率。

  • 压缩后的数据无法动态更改:压缩布隆过滤器后,无法再直接对比特数组进行动态的插入删除操作,需要先将压缩后的数据解压缩还原为比特数组,然后再进行操作。因此,在设计布隆过滤器时需要考虑数据的可变性。

实现原理

是将其比特数组压缩为一个二进制数据流,具体的步骤如下:

  1. 布隆过滤器比特数组拼接成一个长的二进制字符串(即将比特数组中的所有字节拼接成一个二进制字符串)。
  2. 二进制字符串进行压缩,常用的压缩算法有 gzipbzip2LZ77/LZ78 等。
  3. 压缩后的数据流布隆过滤器的元数据一起保存到一个文件或传输到另一个系统中。
  4. 在解压时,也需要先读取存储的元数据,根据元数据信息来还原布隆过滤器的比特数组。然后将比特数组用于查询元素是否存在于布隆过滤器中。

实现代码

实现


#include <iostream>
#include <vector>
#include <bitset>
using namespace std;
#include <zlib.h>
#include <string>
#include <xxhash.h>
// #include <MurmurHash3.h>
//在实际使用中,需要对每个哈希值进行分组,根据不同的压缩算法和参数进行压缩,将布隆过滤器压缩成字节数组,//在查询的时候,也需要进行解压缩,还原哈希值位比特数组class CompressBloomFilter
{
public:bitset<1024> bloomfilter_; //原始的布隆过滤器,用于数据的查询//压缩后的布隆过滤器及其相关的元数据
private:vector<char> compressData_;    //压缩之后的数据uLongf compressed_size_ = 0;   //被压缩之后的数据大小,uLongf,无符号浮点数uLongf uncompressed_size_ = 0; //还没被压缩之前的数据大小size_t count_ = 0;bool IsCompressed = false;public://往布隆过滤其中添加数据void add(const string &element){if (!IsCompressed){hash<string> h1;bloomfilter_.set(h1(element) % 1024); //设置进位图中// xxhash具有良好的分布型和低碰撞性unsigned long long hash = XXH32(element.c_str(), element.size(), 0); //这个是通过xxhash计算一个32位的hash值bloomfilter_.set(hash % 1024);count_++;}}//压缩void compress(){//如插入了{1,3,5}对应转化之后的就是101010string bitset_str = bloomfilter_.to_string(); //把位图变成一个字符串的形式(二进制的形式)//压缩位图中的数据uLongf buffersize = bitset_str.size();vector<char> buffer(buffersize, 0); //开buffersize个空间,每个空间上都是compress2((Bytef *)&buffer[0], &buffersize, (const Bytef *)bitset_str.c_str(), bitset_str.size(), Z_BEST_COMPRESSION);//记录压缩后的数据以及元数据,compressData_ = buffer;                 //现在bufer中的都是已经被压缩过的数据compressed_size_ = buffersize;          //压缩的数据大小uncompressed_size_ = bitset_str.size(); //还没被压缩之前的数据IsCompressed = true;}//将压缩之后的bloom filter解压并还原成为比特数据bitset<1024> decompress(){//解压缩压缩后的数据uLongf buffersize = uncompressed_size_;vector<char> buffer(buffersize, 0); //把解压缩的数据放到这个buffer中//解压缩uncompress((Bytef *)&buffer[0], &buffersize, (const Bytef *)&compressData_[0], compressed_size_);//将解压缩后的数据转化成比特数组string uuncompressdata(buffer.begin(), buffer.end());bitset<1024> bitset(uuncompressdata); //使用字符串01串来初始化这个位图IsCompressed = false;return bitset; //直接返回一个位图}bool hashElement(const string &element){if (!IsCompressed){hash<string> h1;unsigned long long hash_ = XXH32(element.c_str(), element.size(), 0);return bloomfilter_.test(h1(element) % 1024) && bloomfilter_.test(hash_ % 1024);}return false;}//计数bloom filtersize_t size(){return count_;}
};

使用示例

int main()
{CompressBloomFilter f;f.add("asd");//添加数据f.add("ddd");f.add("dddas");f.compress();//添加完进行压缩//压缩布隆过滤器处于压缩状态的时候,不能进行插入数据,因为此时布隆过滤器已经被压缩成二进制流了,插入数据后会影响数据的正确性f.add("123");cout<<f.hashElement("123")<<endl;//插入数据的时候,必须要保证处于解压缩状态f.bloomfilter_=f.decompress();//解压缩cout<<f.hashElement("f")<<endl;//判断数据的存在cout<<f.hashElement("asd")<<endl;cout<<f.hashElement("dddas")<<endl;cout<<f.hashElement("ddas")<<endl;cout<<f.hashElement("dddasdfas")<<endl;cout<<f.size()<<endl;return 0;
}

使用场景

  • 大规模数据查询:在需要对海量数据进行查询的场景下,使用布隆过滤器可以减少查询时间和计算开销。此时,如果可以通过压缩布隆过滤器来减少存储和传输的开销,可以进一步提高查询的效率。

  • 分布式系统:在分布式系统中,经常需要对数据进行交换和传输。如果可以通过在布隆过滤器上应用压缩技术来减少存储传输的开销,可以提高系统的性能并降低网络带宽的使用。

  • 内存受限的系统:在内存受限的系统中,使用布隆过滤器进行数据查询可以减少内存的使用,从而提高系统的性能。如果可以将布隆过滤器进行压缩,则可以进一步减少内存的使用。

  • 低延迟的数据查询:在需要快速响应查询请求的场景下,使用布隆过滤器可以减少查询时间和计算开销。如果可以将布隆过滤器进行压缩,则可以进一步提高查询的速度和响应时间。因为多个位被压缩成了一个块,所以只需要进行依次哈希计算和一次位检查就可以判断某个元素是否存在

总之,布隆过滤器的压缩技术可以对存储网络传输计算等方面的开销进行优化,在数据查询分布式计算高性能系统等场景下具有广泛的应用前景。
redisBloom中就使用到了压缩布隆过滤器的方法,在需要存储和传输数据的时候,就对布隆过滤器进行压缩

传输的时候传输bloom filter的位数组元素个数误判率 ,只需要把压缩后的位数组,元素个数,误判率进行发送即可,对方接收后进行解压缩

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

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

相关文章

高分辨率光学遥感图像水体分类综述2022.03

本文是Water body classification from high-resolution optical remote sensing imagery: Achievements and perspectives的学习笔记。 相关资源被作者整理到&#xff1a;这里 文章目录 Introduction基本知识 挑战和机遇挑战1. 有限的光谱信息和小场景覆盖2. 形状、大小和分布…

【JAVA-模块五 数组】

JAVA-模块五 数组 一、数组&#xff08;一维&#xff09;1.1数组是什么&#xff1f;1.2java中数组静态初始化&#xff1a;&#xff08;存&#xff09;两种定义格式&#xff1a;数组初始化格式&#xff1a;静态初始化后&#xff0c;打印数组名&#xff1a; 1.3 数组元素访问&…

javaweb学生在线考试系统dzkf10程序

打分&#xff09;、系统管理&#xff08;数据备份&#xff09;等功能操作。 以学生的身份在登录页面输入账号和密码&#xff0c;经过数据库身份验证&#xff0c;验证成功后登录系统主页&#xff0c;可以使用个人资料管理、试卷查看、在线考试、在线答疑、个人考试成绩查询等功能…

Oracle的学习心得和知识总结(二十三)|Oracle数据库Real Application Testing之Database Replay相关视图

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《Oracle Database SQL Language Reference》 2、参考书籍&#xff1a;《PostgreSQL中文手册》 3、EDB Postgres Advanced Server User Gui…

LVS负载均衡-DR

1.DR模式中每台主机都有一个VIP地址 虚拟网址放在lo网卡上&#xff08;回环网卡&#xff09; arp_ignore1 Arp_announce2 系统不使用IP包的源地址来设置ARP请求的源地址&#xff0c;而选择发送接口的IP地址 2.内核参数修改 3.vim /etc/rc.conf 开机自启动 Chmod x /etc/rc.d…

【翻译一下官方文档】之uniapp的导航条设置

目录 uni.setNavigationBarTitle(OBJECT) uni.setNavigationBarColor(OBJECT) uni.hideHomeButton(OBJECT) uni.setNavigationBarTitle(OBJECT) 动态设置当前页面的标题。 OBJECT参数说明 参数类型必填说明titleString是页面标题successFunction否接口调用成功的回调函数fai…

卷积神经网络总结

1、卷积核 进行互相关运算。 卷积核的大小一般是奇数。 卷积核的本质类似于提取局部特征&#xff08;过滤器&#xff09;&#xff0c;当层层卷积核叠加后&#xff0c;卷积核的感受野变大&#xff0c;卷积核的作用逐渐向提取全局抽象特征靠近。最后一层的神经元应该对整个输入…

SpringBoot中@EnableAsync和@Async注解的使用

目录 1.EnableAsync 注解1.1 配置类使用示例1.2 复制请求上下文 2.用法1&#xff1a;Async 注解2.1 测试Controller2.2 测试Service2.3 测试ServiceImpl2.4.测试 4.用法2&#xff1a;直接使用 taskExecutor 做异步4.1 重新实现&#xff1a;测试ServiceImpl4.2 测试 5.Async异步…

ArcGIS三体阴影(影像三维)显示马赛克?

我们经常基于ArcGIS通过DEM来做山体阴影 但是有时候你一放大就会出现很强的马赛克的效果 还有我们在利用ArcScene建三维场景 即使数据分辨率很高也会出现马赛克效果 那怎么来解决这个问题呢 让我们的山体阴影显示更加细腻 三维没有马赛克的效果呢&#xff1f; 右键图层选择如…

地铁站人流检测硬件部分

目录 一、概述 二、驱动程序 2.1debug串口 2.2体重传感器HX711 2.3滴答定时器 2.4ESP8266 2.5人体检测 2.6 IIC的GPIO 2.7 OLED的IIC 2.8 LED 三、应用 四、中断 一、概述 使用STM32C8T6作为主控 A9 ---> tx&#xff08;调试串口&#xff09; A10 ---> …

android framework-ActivityManagerService(AMS)下

一、ActivityThread \frameworks\base\core\java\android\app\ActivityThread.java 1.1、main public static void main(String[] args) {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");// Install selective syscall interceptionAnd…

Hudi数据湖技术之核心概念

目录 1 基本概念1.1 时间轴Timeline1.2 文件管理1.3 索引Index 2 存储类型2.1 计算模型2.1.1 批式模型&#xff08;Batch&#xff09;2.1.2 流式模型&#xff08;Stream&#xff09;2.1.3 增量模型&#xff08;Incremental&#xff09; 2.2 查询类型&#xff08;Query Type&…

4.3调整基类成员在派生类中的访问属性的方法

同名成员 在定义派生类的时候&#xff0c;C语言允许派生类与基类中的函数名相同。如果在派生类中定义了与基类中相同的成员&#xff0c;则称派生类成员覆盖了基类的同名成员&#xff0c;在派生类中使用这个名字意味着访问在派生类中重新说明的成员。为了在派生类中使用基类的同…

C++ -4- 类和对象(下)

文章目录 1.初始化列表什么是初始化列表&#xff1f;初始化列表的 意义及使用 2.explicit关键字单参数构造函数&#xff08;C98&#xff09;多参数的构造函数&#xff08;C11&#xff09;&#xff08;了解&#xff09; 3.static静态成员静态成员变量与静态成员函数静态成员变量…

前端02:CSS选择器等基础知识

CSS基础选择器、设置字体样式、文本样式、CSS的三种引入方式、能使用Chrome调试工具调试样式 HTML专注做结构呈现&#xff0c;样式交给CSS&#xff0c;即结构&#xff08;HTML&#xff09;和样式CSS相分离 CSS主要由量分布构成&#xff0c;选择器以及一条或多条声明 选择器&…

18.Java泛型

目录 1. Java基本介绍 2. JDK下载安装及其环境配置 3. 一个简单的java程序 4. Eclipse基本使用、数据类型、运算符 5. 控制语句&#xff08;if、switch、for、while、foreach&#xff09; 6. Java数组 7. Java字符串对象(String|StringBuffer|StringBuilder|StringJoiner…

OFDM-LS信道估计 MMSE信道估计公式推导

假设ofdmN个子载波之间是完全正交的&#xff0c;即不考虑ICI影响&#xff0c;通过发送训练序列来实现信道估计。 其中&#xff0c;在推导6.8的时候&#xff0c;需要将6.6先拆解一下。 X − 1 Y X − 1 ( X H Z ) X − 1 X H X − 1 Z H X − 1 Z X^{-1}Y X^{-1}(XHZ)…

LeetCode213 打家劫舍 II 动态规划法

题目地址 https://leetcode.cn/problems/house-robber-ii/ 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装…

【Hive实战】探索Hive 2.X以及更早版本的MetaStore

探索Hive 2.X以及更早版本的MetaStore 文章目录 探索Hive 2.X以及更早版本的MetaStore概述配置元数据服务和元数据存储库基础配置参数其他配置参数默认配置配置元服务数据库使用内嵌模式的Derby库使用远程数据存储库 配置元数据服务本地/内嵌服务配置远程服务配置 元数据服务配…

【KingSCADA】什么是精灵图以及如何创建精灵图

大家好&#xff0c;我是雷工&#xff01; 本篇学习精灵图的制作&#xff0c;以下为学习内容及相关笔记。 一、什么是精灵图 精灵图是一种在外观上类似组合图&#xff0c;但内部嵌入了比较丰富的动画链接与逻辑控制&#xff0c;工程开发人员只要将其从精灵图库中调出来放置在开…