数据库课程 CMU15-445 2023 Fall Project-2 Extendible Hash Index

0 实验结果

在这里插入图片描述
tips:完成项目的前提不需要一定看视频

1 数据结构:扩展哈希

扩展哈希
解释下这张图:
图中header的最大深度2,directory最大深度2,桶的容量2。
最开始的时候只有一个header。
插入第一个数据,假设这个数据对应的哈希值是00…100
header的索引使用的是哈希值的MSB,即高位,因为header深度2,所以直接取高两位,即0.
此时header[0]并没有指向的directory,所以需要先new page创建目录页面,创建出的目录页面,默认gd,即全局深度应该为0.
目录页面实际指向页面的索引个数:1 << gd,即默认1个索引,此时索引到的bucket id为非法页面,索引需要new page创建桶页面。
将哈希值00…100对应的键值对存入桶中,并更新header,directory,bucket之间的索引关系。
不断插入数据,将导致桶溢出,此时就需要进行分类,也即图中下面部分的情况。
需要注意的是,当从directory索引bucket的时候使用的是哈希值的LSB,而由几个位索引则由directory的gd决定。

2 任务要求

2.1 Read/Write Page Guards

需要实现 BasicPageGuard, ReadPageGuard, WritePageGuard 的移动构造函数,移动赋值操作,析构函数。
移动构造,移动赋值就是转移guard的所有权,但是移动赋值操作,需要释放本来的资源,接管传入的that指向。

2.1.1 需要注意的地方
  1. WritePageGuard和ReadPageGuard的移动赋值操作,需要先drop,再赋值新的guard。
  2. FetchPageRead和FetchPageWrite返回guard之前,一定要加读/写锁。
2.2 Extendible Hash Table Pages

在这个任务中需要实现header,directory,bucket页面的结构。
header索引directory使用的是MSB
directory索引bucket使用的是LSB

2.2.1 重点说一下directory page
// 注意:全局深度设置为0,本地深度设置为0
ExtendibleHTableDirectoryPage::Init// 1. 插入时,桶满分裂,传入原桶索引,返回新桶索引
// 2. 删除时,获取当前桶索引分裂时产生的对称索引,用于检查一方是否为空桶
ExtendibleHTableDirectoryPage::GetSplitImageIndex// 增加深度,需要拷贝一半,directory目录扩大一倍
ExtendibleHTableDirectoryPage::IncrGlobalDepth// 什么时间可以缩减目录? directory目录大小内,全部满足ld < gd
ExtendibleHTableDirectoryPage::CanShrink()
2.3 Extendible Hashing Implementation

在这个任务中就需要使用 2.2 中准备好的API来实现DiskExtendibleHashTable的构造函数,读值,插入和删除。

2.3.1 插入

第一部分:扩展哈希的介绍,相信对Insert的流程有一个了解。
插入时,如果directory页面不存在,需要先创建directory页面。
如果directory页面存在,需要根据全局深度gd个LSB位索引桶页面,如果桶满,需要进行分裂。
这里有两种情况:

  1. 全局深度大于局部深度
    只进行桶分裂
  1. 全局深度等于局部深度
    目录扩展+桶分裂

这里只对第二种情况分析(其实也只比1多一个操作):

如果全局深度==局部深度,需要增加全局深度,如果全局深度已经最大,则表示扩展哈希已满。增加局部深度ld,分裂过程中对原桶存在的所有key重新分配桶。

存在一种情况: 全部的key又被分到同一个桶中了,此时仍然无法插入新key,所以,插入操作是一个while操作,如果扩展哈希未满,应该继续分裂,尝试插入。

产生的新桶,需要使用UpdateDirectoryMapping更新directory的下标指向新的page_id。
这里提供下实现:

template <typename K, typename V, typename KC>
void DiskExtendibleHashTable<K, V, KC>::UpdateDirectoryMapping(ExtendibleHTableDirectoryPage *directory,uint32_t new_bucket_idx, page_id_t new_bucket_page_id,uint32_t new_local_depth, uint32_t local_depth_mask) {// throw NotImplementedException("DiskExtendibleHashTable is not implemented");uint32_t val = 0;  // 当gd为0,返回索引0for (uint32_t i = 0; i < new_local_depth; i++) {val <<= 1;val |= 1;}uint32_t start_idx = new_bucket_idx & val;for (uint32_t idx = start_idx; idx < directory->Size(); idx += (1 << new_local_depth)) {directory->SetBucketPageId(idx, new_bucket_page_id);directory->SetLocalDepth(idx, new_local_depth);}
}

另外需要注意的是:不支持重复键插入,所以一定要先Lookup检查,不存在时再进入insert操作。

2.3.2 查询

查询是最简单的了,如果后面遇到bug,可以在这个函数中添加以下代码,进行调试。
使用./test/extendible_htable_test >> mylog.txt将log重定向,看下哪里不对劲。

directory_page->PrintDirectory();
bucket_page->PrintBucket();
2.3.3 删除

删除成功的时候需要检查 桶 是否空了,空的话,需要进行合并操作。

在这里插入图片描述
写这个函数的时候,我遇到了合并上的疑惑:

  1. project 2中第三条提到了递归合并,也即如果合并后仍未空,需要继续合并。
  2. 合并后directory索引的维护问题,一开始我以为只需要修改原来空桶的索引指向非空的桶。

所以我尝试看看网上的文章,看到两点注意:

  1. 当前桶和对应的split image桶,有一个为空就需要合并。
  2. 更新directory索引,需要将所有指向空桶的索引修改(这个借助完成的UpdateDirectoryMapping实现)

看了两眼感觉和自己的思路不一样,懒得看了,还是自己写吧。
所以删除的流程应该是:
获取当前桶对应的split 桶(如果存在的话),

  1. 当前桶或者split桶有一个为空,就需要删除空桶
  2. 更新索引。
// 1. 释放空桶
bucket_guard.Drop();
bpm_->DeletePage(bucket_page_id);
// 2. 更新directory_page
// 可能多个下标指向删除的桶 2^(gd-ld)
directory_page->DecrLocalDepth(split_idx);
UpdateDirectoryMapping(directory_page, bucket_idx, split_bucket_page_id,directory_page->GetLocalDepth(split_idx), 0);
  1. CanShrink缩减目录
  2. 重新获取页,为了递归删除,需要更新bucket_guardsplit_bucket_guard
2.3.3.1 注意

注意后面为了并发控制使用FetchPageWrite时候,第4步,重新获取页,需要先drop页面进行解锁,否则重新获取页时候可能会发生死锁。

split_bucket_guard.Drop();
bucket_guard.Drop();
2.4 Concurrency Control

将前面获取页面的操作FetchPageBasic修改为FetchPageWrite或者FetchPageRead,并选择合适的时机drop解锁。

3 知识总结

在这一节中并没有用到新的知识。
这一节中比较有意思的是page_guard中构造函数的实现。

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

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

相关文章

洛汗2保姆级辅助教程攻略:VMOS云手机辅助升级打怪!

在《洛汗2》中&#xff0c;玩家将进入一个充满魔幻色彩的西方世界&#xff0c;体验多种族文明的兴衰与冒险。为了更好地享受这款由普雷威&#xff08;Playwith&#xff09;开发的角色扮演动作手游&#xff0c;使用VMOS云手机将是一个明智的选择。VMOS云手机专为游戏打造了定制版…

基于SSM的“在线CRM管理系统”的设计与实现(源码+数据库+文档+开题报告)

基于SSM的“在线CRM管理系统”的设计与实现&#xff08;源码数据库文档开题报告) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 总体功能模块图 登录页面 后台管理页面 产品信息页面 客…

JSP(Java Server Pages)基础使用二

简单练习在jsp页面上输出出乘法口诀表 既然大家都是来看这种代码的人了&#xff0c;那么这种输出乘法口诀表的这种简单算法肯定是难不住大家了&#xff0c;所以这次主要是来说jsp的使用格式问题。 <%--Created by IntelliJ IDEA.User: ***Date: 2024/7/18Time: 11:26To ch…

consul注册中心与容器自动发现实战

consul简介 Consul 是 HashiCorp 公司推出的开源工具&#xff0c;用于实现分布式系统的服务发现与配置。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案&#xff0c;不再需要依赖其它工具&#xff08;比如 ZooKeeper 等&#xff0…

拾色器的取色的演示

前言 今天&#xff0c;有一个新新的程序员问我&#xff0c;如何确定图片中我们需要选定的颜色范围。一开始&#xff0c;我感到对这个问题很不屑。后来&#xff0c;想了想&#xff0c;还是对她说&#xff0c;你可以参考一下“拾色器”。 后来&#xff0c;我想关于拾色器&#…

动态规划11,完全背包模板

NC309 完全背包 问题一&#xff1a;求这个背包至多能装多大价值的物品&#xff1f; 状态表示&#xff1a;经验题目要求 dp[i][j] 表示 从前i个物品中挑选&#xff0c;总体积不超过j&#xff0c;所有选法中&#xff0c;能选出来的最大价值。 状态转移方程 根据最后一步的状态&a…

C语言 typedef - C语言零基础入门教程

目录 一.typedef 简介 二.typedef 实战 1.typedef 定义基本数据变量 2.typedef 定义结构体 A.常规定义结构体B.typedef 定义结构体C.结构体使用 typedef 和不使用 typedef 区别 3.typedef 定义函数指针 三.猜你喜欢 零基础 C/C 学习路线推荐 : C/C 学习目录 >> C 语言基础…

【2024W33】肖恩技术周刊(第 11 期):猴哥,我好急啊!

周刊内容: 对一周内阅读的资讯或技术内容精品&#xff08;个人向&#xff09;进行总结&#xff0c;分类大致包含“业界资讯”、“技术博客”、“开源项目”和“工具分享”等。为减少阅读负担提高记忆留存率&#xff0c;每类下内容数一般不超过3条。 更新时间: 星期天 历史收录:…

YOLOv9改进 | 特征融合篇,YOLOv9添加iAFF(多尺度通道注意力模块),二次创新RepNCSPELAN4结构,提升小目标检测能力

摘要 特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。虽然它通常通过简单的操作(如求和或拼接)来实现,但这种方式可能并不是最佳选择。在这项工作中,提出了一种统一且通用的方案,即注意力特征融合(Attentional Feature Fusion),适用于…

C++ std::any升级为SafeAny

std::any测试 #include <any>class A { public:int8_t a; };int main(int argc, char* argv[]) {std::any num((int8_t)42);auto a std::any_cast<A>(num);return 0; }异常&#xff1a; 0x00007FFA9385CD29 处(位于 test.exe 中)有未经处理的异常: Microsoft C 异…

网络威慑战略带来的影响

文章目录 前言一、网络威慑的出现1、人工智能带来的机遇二、网络空间的威慑困境1、威慑概念的提出2、网络威慑的限度3、人类对网络威胁的认知变化4、网络空间的脆弱性总结前言 网络威慑是国家为应对网络空间风险和威胁而采取的战略。冷战时期核威慑路径难以有效复制至网络空间…

AI大模型行业应用:企业如何走出一条智能化蜕变之路?

随着chatGPT的横空问世&#xff0c;我们对于人工智能在日常生活中的应用场景逐渐了解&#xff0c;无论是搜索、问答、文生图还是文生视频都出现了很多创意&#xff0c;甚至AI还可以做诗&#xff0c;输入一条指令&#xff0c;就可以让它当场赋诗一首。人工智能的发展&#xff0c…

五种方式帮你提升独立站销售额

想要提升独立站利润&#xff0c;一种方式就是降低你的单个购买用户成本&#xff0c;购买用户一方面是来源于广告引流&#xff0c;另一方面是自然流量和老用户复购&#xff0c;但许多新的独立站后者来源都是非常少的&#xff0c;比较依赖广告引流&#xff0c;当我们广告的单个用…

Splunk、Snort在入侵检测中的应用

前期准备 splunk环境验证 splunk相关命令 查看服务端采集了哪些客户端的日志&#xff1a; ./bin/splunk list deploy-clients Deployment client: CF787A85-1BF8-4460-9FA9-469FEEB95BCD applications: {_server_app_39.30: {action: Install, archive: /home/splunk/var/ru…

ChatGPT 诞生663天后,奥特曼罕见发表预言长文力推超级智能:时间不多了,还有不会使用chatgpt4请看文章开头?

还不知道怎么订阅chatgpt4.0和最新的大模型&#xff0c;可以看这里 &#xff1a;WildCard官方平台订阅chatgpt 今天&#xff0c;OpenAI 公司 CEO 山姆奥特曼在一篇题为《智能时代》的最新个人博文中&#xff0c;概述了自己对于 AI 驱动的技术进步与全球繁荣未来的愿景。这篇文…

用Swift实现验证回文字符串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&#xff0c;如果它是 回文串 &#xff0c;返回 true &#xff1b;否则&#…

深度学习500问——Chapter14:超参数调整(3)

文章目录 14.5 如何改善GAN的性能 14.6 AutoML 14.6.1 什么是AutoML 14.6.2 自动化超参数搜索方法有哪些 14.6.3 什么是神经网络架构搜索&#xff08;NAS&#xff09; 14.6.4 NASNet的设计策略 14.6.5 网络设计中&#xff0c;为什么卷积核设计尺寸都是奇数 14.6.6 网络设计中&a…

一文详解GB28181、RTSP、RTMP

GB28181 GB28181 即 GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》。它是公安部提出的公共安全行业标准&#xff0c;在视频监控领域具有重要地位。 主要目的和应用场景&#xff1a; 目的&#xff1a;解决不同厂家的视频监控设备执行各自标准&…

相交链表 -------------应用

给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 题目数据 保证 整个链式结构中不存在环。 注意&#xff0c;函数返回结果后&…

【机器学习(十)】时间序列预测月销量案例分析—Holt-Winters算法—Sentosa_DSML社区版

文章目录 一、Holt-Winters算法原理(一) 加法模型(二) 乘法模型(三) 阻尼趋势 二、Holt Winters算法优缺点优点缺点 三、Python代码和Sentosa_DSML社区版算法实现对比(一) 数据读入和统计分析(二) 数据预处理(三) 模型训练和模型评估(四) 模型可视化 四、总结 一、Holt-Winters…