• CMU15445-project2-坑和收获总结



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


    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();
    directory_page->SetLocalDepth(0, 1);
    directory_page->SetBucketPageId(0, bucket_page_id_1);
    
    buffer_pool_manager->UnpinPage(directory_page_id_, true);
    buffer_pool_manager->UnpinPage(bucket_page_id_1, true);
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    其他函数:每次的逻辑大概是:根据directory_page_id_buffer_pool_manager中调取directory_page,并根据需求调取或者新建/删除bucket_page,修改完信息后,每次都记得UnpinPage()就行。

    2.3 SplitInsert(),merge()

    SplitInsert()

    • 先正常Insert(),在插入之前检查是否满,满了就跳转到SplitInsert()把插入工作全权交给它,没满就直接正常插入并返回。
    • 注意一种特殊情况:Split之后,仍然有bucket_page是满的,这时候向其要插入元素需要继续Split。
    if (global_depth == local_depth) { // 需要增加global_depth
    	direct_page->global_depth++;
    	更新 direct_page->local_depths_[];
    } 
    
    // 增加local_depth
    new new_bucket_page;
    old_bucket_page 元素转移-> new_bucket_page;
    更新 direct_page->local_depths_[];
    更新 direct_page->bucket_page_ids_[];
    
    // 递归判断是否还需要分页
    bucket_page = 现在key对应的bucket_paeg
    if (bucket_page->Isfull()) {
    	SplitInsert();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Merge()

    • 特殊情况1:当前页面对应的兄弟页面(当时分裂时产生的另一个页面)已经又分裂了,也就是local_depth不相等,这时候直接放弃合并。
    • 特殊情况2:合并完成后,检查兄弟页面是否是空的,如果是空的,主动再进行合并(这种情况就是在解决特殊情况1留下来的空页面)

    TASK #3 - CONCURRENCY CONTROL

    3.1 bucket_page锁的使用

    官方文档用法:

    auto bucket_page = reinterpret_cast<HashTableBucketPage<KeyType, ValueType, KeyComparator> *>(buffer_pool_manager_->FetchPage(old_bucket_page_id)->GetData());
    auto page = reinterpret_cast<Page *> (bucket_page);
    page->RLatch();
    page->RUlatch();
    
    • 1
    • 2
    • 3
    • 4

    我没有理解到的是,如果把整个bucket_page转译成另一个Page,那么使用锁的时候不会改变bucket_page原有的数据项吗。
    而且buffer_pool_manager_->FetchPage()返回的就是一个Page,那为何不直接使用这个返回的Page自带的锁:

    auto page = buffer_pool_manager_->FetchPage(old_bucket_page_id);
    auto bucket_page = reinterpret_cast<HashTableBucketPage<KeyType, ValueType, KeyComparator> *> (page->GetData());
    page->RLatch();
    page->RUlatch();
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    【算法】折半查找
    ERD Online介绍
    双11,客服系统让你告别客服节前emo
    AMD老电脑超频及性能提升方案及实施
    【树的存储结构,孩子链表】
    如何书写一篇好的博客?
    Windows Server 2008安装.NET Framework 3.5
    Windows系统使用MinGW编译二维码库Zbar
    ESP32 ESP-IDF ADC监测电池电压(带校正)
    线性调频Z变换(CZT)
  • 原文地址:https://blog.csdn.net/Kprogram/article/details/125429778