CMU15445-project2-满分收获总结

CMU 15445 Project2 B+Tree CMU 15445 2023spring Project 2 B+Tree 阅读详情


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


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()
CMU15445 (Fall 2023) Project2 - EXTENDIBLE HASH INDEX 思路分享 如果你对文章的某些描述感到疑惑,或是发现了文章的错误,欢迎在评论区提出: ) 阅读详情

相关推荐

CMU15445-project3-满分收获总结

!!gradescope究极大BUG!!!开始之前ValueIndex数据存储三剑客tupleTableHeap数据表信息三剑客CatalogschemacolumnINSERTUPDATEDELETEHASHJOINLIMITDISTINCT排名拉了,没精力优化了太折磨了太痛苦了,看代码的时间比写代码的时间还多,很多天都处于完全没法动键盘的状态。SQL拆分成一棵执行树之后,其中的节点的功能承担者,也是这次实验主要要完成的部分。构造执行树时不会构造Executor,而是用后面的成员函数,和。........

Kprogram的博客 4786

CMU 15445 Projec0 2022

设计C++ 11 的功能特性都有详细的解释,适合对C++不了解的人上手

HUSTIS1804的博客 3196

CMU15445-project1-满分收获总结

0.0 关于线上测试的天坑 在gradescope上测试代码时,没有通过的案例如果显示的是超时,那不一定是因为死锁或者死循环!1.1线程安全 要求了线程安全但又没有说具体怎么做,以至于在最后才回来考虑上锁的问题。其实很简单,在头文件内声明一个锁。在实现的每个函数开头上锁,结尾释放就行。 注意事项: 1.每个return之前都要记得释放锁 2.关于死锁,如果都是开头上锁结尾解锁,根本不会有产生死锁的条件(请求并保持)。 3.如果在一个函数里调用了另一个使用lock的函数,百分百会卡死,因为这个函数的lock还

Kprogram的博客 2357

2022 CMU15445 Project2 B+树

简单来说就是,当你有一个类,这个类中有一个成员为数组。在用这个类初始化一个对象时,你不能确定该将这个数组的大小设置为多少,但知道这整个对象的大小是多少 byte,你就可以用到 flexible array。flexible array 必须是类中的最后一个成员,并且仅能有一个。在为对象分配内存时,flexible array 会自动填充,占用未被其他变量使用的内存。这样就可以确定自己的长度了。例如有一个类 C:class C {int a;// 4 byte。

weixin_45084090的博客 1253

2021 CMU-15445/645 Project #2 : Hash Index

0 前言 21年CMU-15445Project2是实现一个基于可拓展哈希(EXTENDIBLE HASH)的哈希索引。比起Project 1,Project2的难度要高不少,我自己跑完所有的测试花了40s,只能算是一个中规中矩的成绩,在gradescope上好一点的成绩可以压缩到30s以内。不过我还是把它写成博客,希望能帮助到没有头绪的朋友,也希望完成的比较好的朋友能指正。 下面说一下Project2的要点,不过按照课程要求,这里就不放代码了。对于EXTENDIBLE HASH算法理解有困难的朋友可以在

梁熙民的csdn博客 3701

记录一下 CMU 15445 项目

CMU 15445 数据库课程,采用c++语言实现数据库存储引擎~

Unyielding will 7137

CMU15-445 Project1总结2021年

本篇博客是对CMU15-445课程project1的总结,代码的实现借鉴了一些其他前辈的代码,因为自己的C++实在是小白水平,对数据库的实现理解的也不够透彻,就抄了大家的代码,然后理解这些代码之后,再作此篇总结,加深对知识点的理解。 这里附上借鉴的博客:[已满分]CMU数据库(15-445)实验1-BufferPoolManager。 本次实验的原文要求在这里PROJECT #1 - BUFFER POOL 关于本门课程的知识点总结我推荐[CMU-15445] 总述 Project1要求我们实现一个数据库

沈子鸣 4770

CMU15-445 PROJECT #1 - BUFFER POOL(Fall2020实验代码,已满分

实验说明:https://15445.courses.cs.cmu.edu/fall2020/project1 我的完整实验代码见github:https://github.com/nefu-ljw/database-cmu15445-fall2020(已通过gradescope所有测试点) 文章目录TASK #1 - LRU REPLACEMENT POLICY说明代码TASK #2 - BUFFER POOL MANAGER说明代码 TASK #1 - LRU REPLACEMENT POLICY 说明

nefu_ljw的博客 3697

CMU15-445 Project.2总结

对于B+树而言,我们用作为其根节点的父节点;叶子节点的 MinSize 为,内部节点的 MinSize 为;对于B+树中的叶子节点和内部节点而言,必须满足 MinSize 的要求,但对于B+树的根节点而言可以不用满足以上要求。当根节点的子节点只有一个时,我们可以直接将子节点作为新的根节点。对于B+树种的内部节点而言,由于 K 个关键值将整个节点分成了 K+1 个区间,故其有 K+1 个 value ,而叶子节点中 key 与 value 的个数则相同。

L.Wzz的博客 1007

CMU15445 project2(上)

注意有一个GetMinSize()函数,其中争对该页是否是叶子页,做了不同的处理。因为中间页在头部有一个无效的key,用来指向最左边。叶子节点内部存的是RID,什么是RID?page_id + slot number,唯一标识了一个元组。成员:一个存pair的array。成员:存pari的数组和next_page_id。注意该array中第一个元素是一个无效的key。非叶子节点的value是”指针“,实际上是一个。接口:主要是对成员变量的更改函数和获取函数。public继承父类。public继承父类。

RolleX的博客 291

CMU15445 fall 2022/spring 2023 项目环境搭建+选择合适的版本

CMU15445是一门关于数据库管理系统(DBMS)的设计和实现的优秀课程。由数据库领域大佬Andy主讲,同时还有迟策大佬所设计和维护的BusTub,其名声在外之处更是有着极高质量的作业(HOMEWORKS)和项目(PROJECTS)。

grq的博客 8540

CMU15445-2023Fall,Lab0 C++Primer 个人流程记录

Project0 主要就是环境搭建,项目内容还是很简单的。这里只是简略的记录一下过程,不会太详细,越来越忙了啊……

EQUINOX1的博客 1913

cmu15445 2023spring Project #2 - B+Tree

到提交为止(2023-05-13),gradescope上有42人完成了project2。由于缓冲区管理用的是全局锁,笔者的B+树并发性能算是一般。笔者之前也写过B+Tree,但是是单线程内存B+Tree,这次多线程磁盘B+Tree还是挺困难的。相较于内存索引,磁盘索引还需要管理缓存区。另外两者的I/O粒度也不同,前者是cpu cacheline,后者是磁盘页/块。这导致两者在设计的着重点也不同,内存B+Tree的节点较小,需要充分利用每一个字节。

weixin_47734949的博客 1168

CMU15445(2023fall) Project #2 - Extendible Hash Index 匠心分析

在缓冲池管理器中,FetchPage和NewPage函数返回已经锁定的页面指针。这个锁定机制确保页面在没有任何读取和写入时不会被驱逐。为了表示页面在内存中不再需要,程序员必须手动调用UnpinPage。然而,如果程序员忘记调用UnpinPage,页面将永远不会被驱逐出缓冲池。由于缓冲池实际上只有较少的帧,这将导致更多的页面在磁盘和内存之间交换。这样不仅会影响性能,而且这个bug很难被发现。

John_Snowww的博客 1788

CMU15445 2023 PROJECT #2 - EXTENDIBLE HASH INDEX

CMU15445 2023 PROJECT #2 - EXTENDIBLE HASH INDEX

weixin_43570552的博客 2231

CMU15445 2024 Fall Project2 B+树及其并发策略的实现记录

本文分享了CMU15445课程Project2(B+树索引实现)的经验总结。作者详细介绍了实现过程中的关键点:1)B+树页面的三种类型(Header/Internal/Leaf)及其特殊数据结构;2)核心操作的实现难点,包括插入时的分裂逻辑、删除时的借调与合并策略;3)索引迭代器设计;4)并发控制采用蟹行协议。特别强调了分裂时机判断与官方测试要求不一致的问题,并提供了解决方案。实现过程中参考了课程资源、Discord社区讨论和他人博客分享。最终测试结果显示,合理的并发策略能显著提升性能,其中对根节点的特殊处

weixin_45477476的博客 779

cmu15445(2024fall) project 2

project 2比p1难度要更大,代码量更大且涉及的知识更多,实现中出现的bug更多,好在是最后全部解决了。我最大的收获在于对于多线程编程的理解更深入了,实际发现解决了多个多线程相关的bug,学会了更多多线程下debug的技巧方法,也见识了更多多线程的bug情况。在之后可以更系统的学习一下多线程编程。同时学会实现B+树也是需要掌握的基础。

Jerome_Yi的博客 1503

CMU 15445 2022 Fall P2 B+Tree Index

分裂internal page的步骤为:1.新建一个空的page,2.将原page的一半转移到新page中,需要注意原page和新page的第一个key都是无效的,3.更新新page所有child page的父节点指针,指向新page,4.获取parent page,5.将用于区分原page和新page的key插入parent page中,6.更新parent page中所有child page的父节点指针。若合并的是internal page,记得更新合并后page的子节点的父节点指针。

qq_41386543的博客 615
上一篇: CMU15445-project1-满分收获总结
下一篇: CMU15445-project3-满分收获总结
Korpse
博客等级 码龄9年 115粉丝 25原创
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值