杀手锏SwissTable

杀手锏SwissTable

0.导语

最近在研究HashJoin的性能,发现SwissTable的性能真牛逼,对于原生的哈希表采用STL的unordered_multimap,其性能一般,为了加速这个查找,Arrow提供了SwissJoin,其实现原理为SwissTable,但是其细节部分还是有很多不一样的地方,本节先来个开篇,以经典的abseil库的代码为例,先聊聊abseil库里面的SwissTable原理。

SwissTable在性能上远超于std::unordered_map的哈希表。

通常哈希表会面临几个问题,其中最重要的便是哈希碰撞。

比较经典的算法有:拉链法、线性探测法。

  • 拉链法

像std::unordered_map的哈希表采用拉链法实现,对于CPU 需要读写内存地址,会检测缓存是否存在,由于链表的随机访问性质,会导致缓存查询失败,性能会骤降。

  • 线性探测法

对于拉链法缓存问题,我们可以使用线性探测法解决,对cache来说比较友好。由于是顺序访问元素,当这些连续的内存正好是cache line的一部分时,省下了CPU指令周期,但是当元素越来越多,连续的序列也会变长,查询缓存失败率也会加大。

因此,我们需要解决几个问题:

  • CPU cache比内存快n倍,如何有效利用cache来加速哈希表的查找?

  • 如何解决hash冲突?

为了解决这些问题,于是有了缓存友好、内存与CPU效率比较高的SwissTable。

1.abseil SwissTable

SwissTable的伪代码:

int8_t* ctrl_;
char* slots_;

SwissTable划分为control byte结构与slots结构,如下图所示:

5d693bf05152a913f36dc060a22974c7.png

对于每个key的hash值,拆分成两部分:

H1: hash最左边57位,找到第几个group。

H2: hash最右边7位,

bdcc6490aad15045278b0afa39dc7f6f.png

假设每个group有16个slot,同时有16个控制字节。

控制字节Carol byte为8位,有三个状态:

10000000

  • 删除

11111110

  • 在使用

当有数据时,ctro byte长这个样子:00010100,最高位为0。

  • 哨兵

只是个dummy

0019bbb733846de3335db7c7f84055ea.png

当执行查询时,先通过h1计算出对应group的起始位置,然后扫描当前group中的控制字节(通过h2),搜索出对应的slot。

其中根据group的其实位置扫描key是否存在这一步骤,如果进行“线性探测”可就太慢了。

于是SwissTable怎么做了?

一组的控制字节为 128 位,可以放入 L1 的cache line,像SSE2这类的指令,可以直接使用128位快速搜索出对应的slot。

所以可以一次比较一整个group的control bytes信息,从而确定这个key在不在当前group中,如下图所示,一次可以比较16个值。如果当前group没有找到,继续查找下一个group。当然涉及的好的话,一次可以通过simd算n个group。

a9386d589d717067822e9790cdf160c3.png

插入过程:

  • 查找到目标的key,如果存在,更新目标key,完毕。

  • 当前hash值可以计算出哪个group,这个group如果满了,就下一个group找空位,然后插入对应slot。

当然插入过程还涉及扩容操作。

本节简单讲解了SwissTable的原理,下一节详细讲讲Arrow的SwissTable。

更多资料,欢迎加入与我一起探讨。

f2761ac0bed6aff0a6e772fafb0f3027.jpeg

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

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

相关文章

Java GUI——网页浏览器开发

Java GUI——网页浏览器开发 前言:为了做java课设,学了一手Java GUI。感觉蛮有意思的,写写文章,做个视频记录一下。欢迎大家友善指出我的不足 网页浏览器开发录制视频,从头敲到尾 任务需求 界面需求 菜单栏 文件 【…

接口测试之文件上传

在日常工作中,经常有上传文件功能的测试场景,因此,本文介绍两种主流编写上传文件接口测试脚本的方法。 首先,要知道文件上传的一般原理:客户端根据文件路径读取文件内容,将文件内容转换成二进制文件流的格式…

vue3中使用vue-simple-uploader

vue-simple-uploader本身是基于vue2的,直接npm i vue-simple-uploader -S下载下来版本的是0.7.6。在vue3中无法使用会报错。 解决:使用next安装接下来要发布的版本就会下载1.0.1版本,即可使用vue3 npm i vue-simple-uploadernext -S 注意&…

【linux】ssh 和adb connect区别

问:ssh 与ping的区别 答:SSH(Secure Shell)和Ping是两种完全不同的网络工具。 SSH是一种加密的网络协议,用于安全地远程管理或访问远程计算机。它提供了一种安全的通信方式,可以在不安全的网络上进行远程登…

SpringMVC的架构有什么优势?——视图与模型(二)

前言 「作者主页」:雪碧有白泡泡 「个人网站」:雪碧的个人网站 「推荐专栏」: ★java一站式服务 ★ ★ React从入门到精通★ ★前端炫酷代码分享 ★ ★ 从0到英雄,vue成神之路★ ★ uniapp-从构建到提升★ ★ 从0到英雄&#xff…

【数据结构】‘双向链表’冲冲冲

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Prometheus技术文档-概念

Prometheus是一个开源的项目连接如下: Prometheus首页、文档和下载 - 服务监控系统 - OSCHINA - 中文开源技术交流社区 基本概念: Prometheus是一个开源的系统监控和告警系统,由Google的BorgMon监控系统发展而来。它主要用于监控和度量各种…

《UNIX 传奇:历史与回忆》读后感

《UNIX 传奇:历史与回忆》 是 bwk(Brian W. Kernighan)2019 年的新作,回忆了 UNIX 在大半个世纪的风雨历程,是一本引人入胜的书籍。通过对 UNIX 操作系统的历史和发展进行详细的叙述和回顾,让我对这个操作系…

微信-公众号服务器配置,小程序token认证

参考微信文档 这部分代码试用于微信公众号的服务器token校验,且适用于小程序的token校验 接入概述 | 微信开放文档 @RequestMapping(value = "/message/verify")public @ResponseBody String verify(HttpServletRequest request, HttpServletResponse respons…

【eNSP】静态路由

【eNSP】静态路由 原理网关路由表 实验根据图片连接模块配置路由器设备R1R2R3R4 配置PC的IP地址、掩码、网关PC1PC2PC3 配置静态路由查看路由表R1R2R3R4测试能否通信 原理 网关 网关与路由器地址相同,一般路由地址为.1或.254。 网关是当电脑发送的数据的目标IP不在…

CSS基础介绍笔记1

官方文档 CSS指的是层叠样式(Cascading Style Sheets)地址:CSS 教程离线文档:放大放小:ctrl鼠标滚动为什么需要css:简化修改HTML元素的样式;将html页面的内容与样式分离提高web开发的工作效率&…

ROS实现自定义信息以及使用

常见的消息包 消息包定义一般如下👇 (1)创建包和依赖项 (2)在新建的qq_msgs的包新建msgs的文件夹,在该文件夹里面新建Carry.msg类型的文件。 其实,Carry.msg就是你自己定义的消息类型&am…

C++入门(小白篇1—编译器安装-代码注释等)

前言: 最近想学一下一下C看了一些博客内容写的倒是很充实,但是,细节不到位,我是有Python基础的,所以学习来蛮快的,但是对于小白的话,有好多小细节大多数博客还是不够详细,由此我想写…

【机器学习】在 MLOps构建项目 ( MLOps2)

My MLOps tutorials: Tutorial 1: A Beginner-Friendly Introduction to MLOps教程 2:使用 MLOps 构建机器学习项目 一、说明 如果你希望将机器学习项目提升到一个新的水平,MLOps 是该过程的重要组成部分。在本文中,我们将以经典手写数字分类…

新型高速 JavaScript 运行时 Bun 0.7 发布

导读近日,新型 JavaScript 运行时 Bun 正式发布了 0.7 版本,带来了重大的升级。据悉,Bun 是一个配套齐全的 JavaScript 解决方案,集运行时、打包器、转译器和包管理器于一体,追求极致的运行速度。此次更新主要集中在与…

5G RedCap

5G RedCap指的是3GPP所提出的5G标准。与之前发布的5G标准相比,功能更加精简。5G RedCap于2019年6月首次被纳入3GPP R17研究项目。 把一些不必要的功能去掉就可以带来模组价格的降低。背后的基本想法是:为物联网应用定义一种新的、不那么复杂的NR设备。 …

Android Framework解析——WMS原理

作者:bobby_developer 1. WMS原理:WMS角色与实例化过程 window:它是一个抽象类,具体实现类为 PhoneWindow ,它对 View 进行管理。Window是View的容器,View是Window的具体表现内容; windowManager:是一个接…

智慧图书馆:数字发展时代的文化粮仓

以下内容来自于易知微官网,进入官网可以了解更多详情。 注意:案例数据均为虚拟数据 书籍犹如灯塔指引着人们前进的方向,同时图书馆也是一个城市的灵魂。图书馆在为我们提供学习场所的同时,也在城市文明建设过程中起着不可替代的…

事件循环原理

事件循环 浏览器的进程模型 何为进程? 程序运行需要有它自己专属的内存空间,可以把这块内存空间简单的理解为进程 每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。 何为线程? 有…

企业邮箱安全对比:哪家公司的产品更可靠?

邮箱仍然是企业沟通的关键组成部分,但往往容易受到安全威胁。为了保护敏感信息,企业需要采取措施使企业邮箱更加安全。这可以通过投资先进的安全解决方案,创建限制或控制访问的策略,并定期对员工进行最佳实践培训来实现。 1、投资…