CMU15445-project2-满分收获总结

本文总结了CMU15445-project2的三个任务,包括PageLayouts的优化策略、HashTable的高效实现(SplitInsert与Merge)以及并发控制中bucket_page锁的使用和Unlatch时机。讨论了目录页和bucket页的区别,以及debug辅助函数在哈希表调试中的作用。


在这里插入图片描述
(我也不知道排名为啥这么高,完全没有优化)
在这里插入图片描述


TASK #1 - PAGE LAYOUTS
1.1 对于两种page的理解

bucket_page:用来存储键值对的page,利用readable_[]判断当前index是否存有数据,occupied判断当前index是否装过数据(按道理这玩意儿没啥用)。而数组就用来存储键值对。
directory_page:其实可以看作是HashTable的信息存储地,因为需要并发控制以及保存关键信息,故直接利用一个page来存储这些信息,每次使用的时候提取该page出来就行。

1.2 一些简单的优化思路
  1. 插入的时候,需要先判断是否有空位,然后再找位置插入。可以在判断有没有空位的时候就找好插入位置。
  2. Isfull(),Isempty()这种,可以按char直接判断是否全1或者全0,而不用一位一位遍历。

TASK #2 - HASH TABLE IMPLEMENTATION
2.1 坑:关于需要实现的文件

这里没有同以往的 TASK文档一样,明确告知我需要实现的文件在哪里,需要从最后面的测试需要提交的文件列表里面去找,但文档出现了如下错误:

图中所示的extendible_probe_hash_table并不存在,再查看后面的打包命令行可以发现,实际上的文件名是extendible_hash_table
在这里插入图片描述

2.2 如何下手(理解Task2需求)

1- extendible_hash_table的概念:本身不会存储什么pointer,depth等数据,这些数据都是需要存储在能存进硬盘的Page中的(directory_page或者bucket_page),可以把它看作一个工具类,其需要的每一个信息都是要从buffer_pool_manager中请求得到的page中获取。

2- 构造函数:需要在这里新建一个directory_page和对应的bucket_Page,初始化global_depth = 1 和`local_depth = 1``(local_depth = 0也可以,等于1时需要新建两个bucket_page,0时只需一个),新建的方法我是在测试函数中学会的:

  • 不管是 New()还是Fetch()都需要记得UnpinPage()
  • bucket_page不需要reinterpret_cast,因为新建的时候没有需要设置的参数。
  • 不需要存储长度信息,2 ^ global_depth就是长度
  • 除了directory_page_id,不要声明任何关于hashtable的私有变量来存储其信息,因为需要满足并发,每次的信息必须从bplm中调取出来才能保证安全。
  • (这里的代码不完全,不要直接复制)
auto directory_page =
      reinterpret_cast<HashTableDirectoryPage *>(buffer_pool_manager->NewPage(&directory_page_id_, nullptr)->GetData());

directory_page->IncrGlobalDepth();

page_id_t bucket_page_id_1 = INVALID_PAGE_ID;
buffer_pool_manager->NewPage(&bucket_page_id_1, nullptr)->GetData()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值