当前位置: 首页 > 编程日记 > 正文

C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

布隆过滤器是一种判定元素是否存在于集合中的方法。其基本原理是使用哈希方法将数据映射到一个很长的向量上。在维基百科上,它被称为“空间效率和查询时间都远远超过一般的算法”的方法。由于它只保存散列的数据,所以对于很长的数据有着良好的压缩特性,这个是个不争的事实(可以参见《布隆过滤器 (Bloom Filter) 详解》)。但是其查询效率究竟如何,我们还是要实际测试一下。(转载请指明出于breaksoftware的csdn博客)

我们选用unordered_multiset作为对比对象,是因为在《C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(ubuntu g++)——遍历和查找》中,实验验证它的查询效率是最高的。

由于布隆过滤器存在以下特性:

  • 判定不存在的一定不存在
  • 判定存在的可能不存在

实验分为两部分:

  1. 查找集合中不存在的元素
  2. 查找集合中存在的元素

由于布隆过滤器存在一定的误算率,所以在1的场景下,存在判定元素存在的可能性(存在误算率)。

我们使用的是https://github.com/ArashPartow/bloom版本的实现,它可以指定误算率。

由于散列计算需要时间,所以数据的长度也将是一个比较因子。于是上述每个实验都有三个影响因素

  1. 误算率
  2. 集合大小
  3. 数据长度

查找集合中不存在的元素

不同数据长度

在集合大小(65536)和误算率(0.1)确定的情况下,我们比较不同数据长度下,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建时间

可以见得,查找(search)时间比构建(build)时间要少很多。

当数据长度小于500时,bloomfilter比unordered_multiset构建时间要短。但是随着数据长度的增长,前者将花费更多的时间。也就是说unordered_multiset和bloomfilter的构建时间都符合X+Y*Length线性增长规律,但是unordered_multiset初始耗时X比bloomfilter要长,但是其增长系数Y比后者小。

查找时间

再看下查找(search)时间

在数据长度低于80时,bloomfilter比unordered_multiset要快。但是随着数据长度的增加,前者越来越慢。当数据长度达到30000时,存在2倍多的差距。

随着数据长度增加,bloomfilter的查找时间比unordered_multiset要长。

上述趋势规律在数据个数比较小时也适合,只是交叉点有所变化

不同集合大小

在数据长度(256)和误算率(0.1)确定的情况下,我们比较不同集合大小时,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建耗时

在相同数据长度的情况下,bloomfilter比unordered_multiset构建速度要快些,而且随着集合个数增长,其优势更加明显。

查找时间

当集合个数少于1,000,000个时,bloomfilter的查找还是比unordered_multiset慢,但是unordered_multiset随着集合大小增长会越来越慢。一旦超过阀值,unordered_multiset就永远比bloomfilter要慢了。而bloomfilter的查找速度一直比较稳定。

不同误算率

在数据长度(256)和集合个数(1048576)确定的情况下,我们比较不同误算率下,unordered_multiset、bloomfilter的构建,和它们查找1024个不存在的元素的时间消耗。

构建时间

因为unordered_multiset和误算率没有关系,而且数据长度和集合大小固定,所以它几乎是条直线。但是我们看到随着误算率的降低,bloomfilter的构建速度也在变慢。

查找时间

由于unordered_multiset和误算率无关,所以其查找时间也几乎是条直线。但是随着误算率降低,bloomfilter的查找时间越来越高。

查找集合中存在的元素

经过实验,其结果和“查找集合中不存在的元素”规律一致,这儿就不把图再罗列了。

总结:

  1. 随着集合个数增长,unordered_multiset的查找速度越来越慢。而bloomfilter比较稳定。个数较少时bloomfilter比unordered_multiset慢,但是超过一定阀值,bloomfilter将比unordered_multiset快。
  2. 随着数据长度增长,bloomfilter的查找速度越来越慢。而且速度比unordered_multiset慢较多。
  3. 随着误算率降低,bloomfilter的查找速度越来越慢。
  4. 除了内存因素外,检测bloomfilter是否是适合应用场景,需要基于上面三个因素做实验之后才能判断。

测试代码和生成图的代码见https://github.com/f304646673/test_bloomfilter

相关文章:

递归思想解决输出目录下的全部文件

刚刚了解了下递归思想 递归就是在方法内调用本方法 下面说一个实际的应用 输出目录下的全部文件,当目录中还有目录时,则进入目录输出里面的文件 import java.io.*; class ShowFile{public static void showfile(File files){if(files.isDirectory()){Fi…

实战之网马解密之shellcode篇

今天上卡卡社区发现里面发了个网马解密的链接,呵呵 顺便试试看能解出来不.呵呵. 相信各位已经对网马有点了解了吧.一般网马都是加密了的.关于什么是网马以及怎么防止网马也不是本文的重点.本文是实战shellcode网马解密.以后的博文会放出常见的网马及其解密.以及常见的解密工具的…

机器学习中的线性回归,你理解多少?

作者丨algorithmia编译 | 武明利,责编丨Carol来源 | 大数据与人工智能(ID: ai-big-data)机器学习中的线性回归是一种来源于经典统计学的有监督学习技术。然而,随着机器学习和深度学习的迅速兴起,因为线性(多…

Golang反射机制的实现分析——reflect.Type类型名称

现在越来越多的java、php或者python程序员转向了Golang。其中一个比较重要的原因是,它和C/C一样,可以编译成机器码运行,这保证了执行的效率。在上述解释型语言中,它们都支持了“反射”机制,让程序员可以很方便的构建一…

设计模式----组合模式UML和实现代码

2019独角兽企业重金招聘Python工程师标准>>> 一、什么是组合模式? 组合模式(Composite)定义:将对象组合成树形结构以表示‘部分---整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性. 类型:结构型模式 顺口…

Golang反射机制的实现分析——reflect.Type方法查找和调用

在《Golang反射机制的实现分析——reflect.Type类型名称》一文中,我们分析了Golang获取类型基本信息的流程。本文将基于上述知识和经验,分析方法的查找和调用。(转载请指明出于breaksoftware的csdn博客) 方法 package mainimpor…

太狠!33岁年薪50万:“复工第一天,谢谢裁掉我!” 网友:有底气!

最近脉脉一则帖子炸锅了:某HR发帖称公司以按时下班为由裁员。这种情况下很多人都慌了,大家纷纷把“副业救国”奉为神律。可是你有没有认真的想过,为什么现在大家都需要副业:意外裁员后,房贷能够按时还上不至于“回收”…

SEO内部链接优化的技巧

内部链接是搜索引擎优化中的重要因素之一。思亿欧做的SEO调查发现,国内大部分网站都没有怎么做内部链接优化。这可能是网站管理员并不知晓SEO或者是对内部链接优化不够重视。 内部链接的设计不能是单纯的为了SEO的目的而作内部链接,同时要注意规划一个良…

Ubuntu 15.10安装ns2.35+nam

2019独角兽企业重金招聘Python工程师标准>>> Step1: 更新系统sudo apt-get update #更新源列表sudo apt-get upgrade #更新已经安装的包sudo apt-get dist-upgrade #更新软件,升级系统Step2:安装ns2需要的几个包sudo apt-get install build-essentialsu…

bug诞生记——不定长参数隐藏的类型问题

这个bug的诞生源于项目中使用了一个开源C库。由于对该C库API不熟悉,一个不起眼的错误调用,导致一系列诡异的问题。最终经过调试,我们发现发生了内存覆盖问题。为了直达问题根节,我将问题代码简化如下(转载请指明出于br…

yahoo註冊.com 域名1.99$/年

yahoo註冊.com 域名1.99$/年趕快去註冊吧http://order.sbs.yahoo.com/ds/reviewplanoption?.pYD1&mdom&.srcsbs&.promoBESTDEAL&dzzhen an.com支持paypal付款一個yahoo帳戶只能註冊一個如果覺得續費比較貴,可在註冊兩個月後轉出到godaddy.转载于:h…

Excel弱爆了!这个工具30分钟完成了我一天的工作量,零基础、文科生也能学!...

在大数据浪潮当中,数据分析是这个时代的不二“掘金技能”。我们每一个人,每天无时无刻都在生产数据,一分钟内,微博上新发的数据量超过10万,b站的视频播放量超过600万......这些庞大的数字,意味着什么&#…

Myeclipse快捷键的使用

存盘 Ctrls(肯定知道) 注释代码 Ctrl/ 取消注释 Ctrl\(Eclipse3已经都合并到Ctrl/了) 代码辅助 Alt/ 快速修复 Ctrl1 代码格式化 CtrlShiftf 整理导入 CtrlShifto 切换窗口 Ctrlf6 <可改为ctrltab方便> ctrlshiftM 导入未引用的包 ctrlw 关闭单个窗口 F3 跳转到类、变量的…

PL/SQL三种集合类型的比较

PL/SQL三种集合类型的比较<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />集合是指在一个程序变量中包含多个值。PL/SQL提供的集合类型如下&#xff1a;Associative Array:TYPE t IS TABLE OF something INDEX BY PLS_INTEGER;N…

夺得WSDM Cup 2020大赛金牌的这份参赛方案,速来get!

近日&#xff0c;在美国休斯敦闭幕的第13届网络搜索与数据挖掘国际会议&#xff08;WSDM 2020&#xff09;上&#xff0c;华为云语音语义创新Lab带领的联合团队&#xff0c;摘得WSDM Cup 2020大赛“论文引用意图识别任务”金牌&#xff08;Gold Medal&#xff09;。WSDM被誉为全…

bug诞生记——信号(signal)处理导致死锁

这个bug源于项目中一个诡异的现象&#xff1a;代码层面没有明显的锁的问题&#xff0c;但是执行时发生了死锁一样的表现。我把业务逻辑简化为&#xff1a;父进程一直维持一个子进程。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 首先我们定义一个结构体Pro…

Linux下SVN服务器支持Apache的http和svnserve独立服务器

2019独角兽企业重金招聘Python工程师标准>>> 说明 服务器操作系统&#xff1a;CentOS 6.6 关闭防火墙&#xff0c;SElinux 实现 1、在服务器上安装配置SVN服务&#xff1b; 2、SVN服务支持svnserve独立服务模式访问&#xff1b; 3、SVN服务支持Apache的http模式访问…

AWS攻略——使用CodeCommit托管代码

除了我们熟悉的github&#xff0c;各大云厂商也有自己的代码托管服务。本文讲解如何在Amazon的CodeCommit中托管代码。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 根账户登录 AWS有两种账户登录界面。 IAM账户登录界面 根账户登录界面我们先使用根…

使用alterMIME实现添加message footer功能

1. 安装alterMIME tar zxvf altermime-0.3.8.tar.gz cd altermin3-0.3.8 make make install altermine将被编译安装到/usr/local/bin/2. 使用必备条件&#xff1a;一个运行且配置正常的邮件服务器3. 配置AlterMIME3.1 为altermine创建一个系统帐号&#xff0c;如下&#x…

Facebook最新研究:无需额外训练AI,即可加速NLP任务

作者 | KYLE WIGGERS译者 | Kolen出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;自然语言模型通常要解决两个难题&#xff1a;将句子前缀映射到固定大小的表示形式&#xff0c;并使用这些表示形式来预测文本中的下一个单词。在最近的一篇论文&#xff08;https://ar…

PgSQL · 特性分析 · full page write 机制

PG默认每个page的大小为8K&#xff0c;PG数据页写入是以page为单位&#xff0c;但是在断电等情况下&#xff0c;操作系统往往不能保证单个page原子地写入磁盘&#xff0c;这样就极有可能导致部分数据块只写到4K(操作系统是一般以4K为单位)&#xff0c;这些“部分写”的页面包含…

局域网DVD yum源的制作

今天在网上溜达,看到这篇文章不错,于是就转载过来,感谢原作者的辛苦劳动.源地址:http://blog.chinaunix.net/u3/94782/showart_1953260.html一&#xff1a;两台计算机做实验<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1&…

AWS攻略——使用S3托管静态网页

在AWS上有很多部署静态网页的方式&#xff0c;比如使用EC2或者Lightsail。但是不管使用上述哪种方案&#xff0c;都需要预先部署如Nignx或者Apache等Http服务。这对纯前端同学来说可能有点复杂&#xff0c;而AWS提供了更简单的部署方式——只需要提供静态网页文件的“S3网页托管…

2020年涨薪26-30%,能实现吗?18%数据科学家是这么期待的

作者丨Big Cloud编译 | 武明利&#xff0c;责编丨Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;本报告将深入探讨亚太地区各个背景、不同年龄和不同地点的专业人员对2019/2020年的见解。今年贡献最大的地区来自新加坡和澳大利亚。因为这些是我们最大的数据点&…

AWS攻略——使用CodeBuild进行自动化构建和部署静态网页

首先声明下&#xff0c;使用“CodeBuild”部署并不是“正统”的方案&#xff0c;因为AWS提供了“CodeDeploy”。如果不希望引入太多基础设施&#xff0c;可以考虑直接使用CodeBuild进行部署。&#xff08;转载请指明出于breaksoftware的csdn博客&#xff09; 创建构建项目 kro…

我们需要什么样的数据架构?

作者 | Stephanie shen编译 | 火火酱&#xff0c;责编丨Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;在大数据和数据科学的新时代&#xff0c;对企业而言&#xff0c;一定要有与业务流程保持一致的中心化数据架构&#xff0c;该架构能随业务增长而扩展&#…

Windows Server 2008 R2 之二十九故障转移群集(一)(

关于Windows Server 2008故障转移群集见http://technet.microsoft.com/zh-cn/library/cc732488(WS.10).aspx实验环境&#xff1a;两台已安装好Windows Server 2008 R2的计算机R2DC01、R2DC02,均为DC、DNS&#xff0c;域名为HBYCRSJ.COM,均有两块网卡。分别为心跳网络和本地连接…

基于多核DSP处理器DM8168的视频处理方法

摘要&#xff1a;随着1080P高清视频以及4K超高清晰视频的普及和应用&#xff0c;基于传统单核DSP处理器的视频信息处理已有些力不从心。为此TI公司推出了一款专门用于高清视频处理的多核DSP处理器&#xff0c;它拥有4个不同类型的处理器&#xff0c;使得视频处理达到了一个更高…

AWS攻略——使用CodeBuild进行自动化构建和部署Lambda(Python)

Aws Lambda是Amazon推出的“无服务架构”服务。我们只需要简单的上传代码&#xff0c;做些简单的配置&#xff0c;便可以使用。而且它是按运行时间收费&#xff0c;这对于低频访问的服务来说很划算。具体的介绍可以常见aws lambda的官网。&#xff08;转载请指明出于breaksoftw…

vmware 添加 磁盘 空间

VMware安装linux的时候默认分配的空间是4GB&#xff0c;可能会不够&#xff0c;这个时候可以通过增加一块虚拟硬盘&#xff0c;将/usr或其他内容拷贝过去解决这个问题&#xff1a;创建虚拟硬盘1、关闭VM中正在运行的虚拟系统&#xff1b;2、在虚拟系统名称上点右键&#xff0d;…