数据库课程 CMU15-445 2023 Fall Project-0 项目记录

news2024/11/17 7:42:09

0. 实验结果

在这里插入图片描述

1. 环境配置

1.1 虚拟机Ubuntu 22.04.4 LTS
1.2 Vscode 插件安装clangd:代码补全
1.3 参考官方Project 0完成环境配置
1.4 获取到的代码,切换分支到2023 Fall

git checkout fc57dab		// 仓库中2023 Fall release版本的哈希值
git branch dev
git checkout dev			// 切换到自己的分支

1.5 修改bustub-private根目录下CMakeLists.txt,增加以下,以使用clang编译

set(CMAKE_C_COMPILER "/usr/bin/clang")
set(CMAKE_CXX_COMPILER "/usr/bin/clang++")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")

如图所示:
CMakeLists.txt修改结果图
同一个CMakeLists.txt文件下注释enable_testing(),因为我不想它编译后自动执行,有时候代码有问题,编译成功之后,我希望手动gdb xx.out进行调试。

1.6 Ubuntu中创建共享文件夹(方便本地访问,将打包后的提交代码,直接拖拽到提交网站里)
参考Ubuntu Samba映射共享文件夹
如果遇到问题参考连接问题解决

具体流程:

1.6.1 编辑sudo gedit /etc/samba/smb.conf,末尾添加

[bustub]
   comment = bustub-private
   path = /home/shuiyihang/bustub-private
   available = yes
   browseable = yes
   public = yes
   read only = no 
   guest ok = yes
   create mask = 0777
   valid users = shuiyihang

1.6.2 添加用户密码
sudo smbpasswd -a shuiyihang
1.6.3 重启服务
sudo systemctl restart smbd

1.6.4 本地windows主机执行或者win+r,输入\\虚拟机IP\bustub

net use * /del /y
net use Z: \\虚拟机ip\bustub /user:用户 密码

2. 任务总结

2.1 Trie::Put 任务

遍历字符串键值的每个字符,可能的情况:
2.1.1
字符串遍历结束时候,每一个字符都可以在map容器中找到对应的节点,此时需要创建TrieNodeWithValue类型的节点,并继承原来TrieNode节点的所有孩子。
2.1.2
字符串遍历过程中,无法在map容器中找到节点,此时需要创建TrieNode节点,并继续遍历,知道字符串遍历结束,创建TrieNodeWithValue节点,存入值。
处理特殊情况:
2.1.3
空键值的插入
2.1.4
空trie的插入

PS补充:

在这个任务中,我看很多人都是使用的栈——自底向上的构建,其实不然,自上向下也是可行的(我正是这种方法),原因在于通过Clone得到的是可以修改的节点。这两种方法并无区别,因为两种方法都是将遍历字符过程中碰到的节点进行Clone。一定要注意不能修改原trie,不然并发测试,肯定无法通过。

2.2 Trie::Remove 任务

2.2.1
删除的节点是叶子节点,删除后要考虑父节点是否还有别的叶子节点或者父节点本身携带数据,是一个TrieNodeWithValue节点,这两种情况下,父节点都不能删除,而是应该克隆之后,删除map容器中的键。
2.2.2
删除的节点如果是中间节点,也即它有孩子,此时应该创建一个TrieNode节点,并继承原来节点的所有孩子。
2.2.3
遍历字符串中的字符,无法找到对应键值,直接返回原来的trie,表示无需删除。

这个任务我是使用的栈结构,将访问到的所有节点压入栈中,从最后一个节点进行修改,向上修改所有节点,返回传入新的根节点创建的trie。

2.3 TrieStore::Put 任务
2.4 TrieStore::Remove 任务
这两个任务合起来一起说,因为都涉及到树的修改。
通过调用上面实现的Trie接口完成这两个接口。
注意trie_store.h中关于两个锁的注释提示。root_lock_用于root的读和写,所有读写操作一定要上锁.

使用方式如下

root_lock_.lock();
// 操作
root_lock_.unlock();

2.5 Debugging任务
这里我选择的方式是在trie_debug_test.cpp中添加代码,打印或者通过gdb来查看变量值获得。

2.6 SQL String Functions任务
这个实现很简单,但是无法像引导里面所说进行测试,因为BufferPoolManager is not implemented yet还没有实现。
这里我编写完成之后并没有本地测试,而是后面提交gradescope完成的测试。

一定要注意的点:
不能修改树,否则并发控制会出问题

3. 知识总结

3.1 std::move(移动语义)

适用于不再需要 value 的情况下,希望把它的资源转移给另一个对象,避免不必要的复制开销。
调用move,转换为一个右值引用,表示它的资源可以被移动。

在本任务中,存放value,一定要使用,因为自定义类型MoveBlocked拷贝构造函数被显式删除,所以不能通过值传递的方式。

MoveBlocked(const MoveBlocked &) = delete;
3.2 dynamic_cast

执行安全类型转换
将基类指针或引用转换为派生类指针或引用
它在有多态性(基类必须有虚函数)的情况下使用,如果类型不正确,指针会返回 nullptr

在进行智能指针转换时,需要先使用智能指针的get方法后,再进行转换。

3.3 std::dynamic_pointer_cast

专门用于智能指针之间的类型转换,适用于 std::shared_ptr
目标类型智能指针 = std::dynamic_pointer_cast<目标类型>(基类智能指针);

3.4 容器 map

操作
emplace: 在容器中插入元素,与insert相比,不需要先构造,再插入。避免不必要的拷贝和移动操作。

dePtr->children_.insert(std::pair<char, int>('a',10));

dePtr->children_.emplace('a',10);

需要注意
如果键已经存在,emplace 不会插入新的元素,而是返回一个pair,pair的第一个元素是一个迭代器指向已存在的元素,第二个元素是一个bool值,表示插入操作是否成功,成功true,失败false。

erase: 传入键值,删除元素。
find: 查找某个键值,成功返回元素的迭代器,否则返回容器end()
at: 和[]值访问一样,访问键对应的值
[]: 可以用于访问和修改

3.5 noexcept

先解释下:移动构造函数
第一个参数是一个右值引用。

CLTest(CLTest &&s) noexcept{}

接下来解释noexcept:
用于指定函数是否可能抛出异常,在函数的参数列表后,使用 noexcept,可以向编译器和调用者表明函数不会抛出异常,从而允许编译器进行更多的优化。

不抛出异常的移动构造函数移动赋值运算符必须标记为noexcept,以保证对自定义类型的对象进行移动而不是拷贝。

3.6 std::thread 线程的使用

std::thread 的基本用法是创建一个线程对象,并传递一个可调用对象(如函数、函数对象、Lambda 表达式等)作为线程的入口点

调用join方法,等待线程结束。join 方法会阻塞主线程,直到线程执行完毕。

std::thread t1([]{
    std::cout << "hello thread" << std::endl;
});
t1.join();
3.7 lambda表达式

C++11引入的匿名函数语法,基本语法

[捕获列表](参数列表) -> 返回类型 { 函数体 }
  • 捕获列表:用于捕获外部变量,可以是值捕获、引用捕获或混合捕获。

  • 参数列表:Lambda 函数的参数列表,类似于普通函数的参数列表,可以没有

  • 返回类型:Lambda 函数的返回类型,可以省略,编译器会自动推导。

  • 函数体:Lambda 函数的具体实现。

3.8 std::future

用于异步编程,允许你在一个线程中启动一个异步任务,并在另一个线程中获取该任务的结果。
std::future 的基本用法是与 std::async 一起使用。std::async 启动一个异步任务,并返回一个 std::future 对象。

// 使用 std::async 启动一个异步任务
std::future<int> futureResult = std::async(std::launch::async,asyncFunction,参数);
std::cout << "等待异步任务完成..." << std::endl;
// 等待异步任务完成并获取结果
int result = futureResult.get();
std::cout << "异步任务完成,结果是: " << result << std::endl;
PS补充: Clone的细节

注意到Clone的时候使用到的是TrieNode的有参构造,所以会先产生一份children的副本,有参构造的函数体中,对children使用了move操作,这个操作不会转移旧trie中children的所有权,只是转移副本的所有权。

4.提交流程

访问 gradescope,注册账号,学校选择CMU(全称),课程编号KK5DVJ,第一节课中获取到的。
4.1 检查错误和编写规范

make format
make check-clang-tidy-p0

4.2 打包

make submit-p0

4.3 签署学术规范声明(必须通过,生成md文件,自动放入打包后的文件)

python gradescope_sign.py

提交的内容,只有我们修改的文件:
提交内容

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

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

相关文章

WPF 保姆级教程怎么实现一个树形菜单

先看一下效果吧: 我们直接通过改造一下原版的TreeView来实现上面这个效果 我们先创建一个普通的TreeView 代码很简单: <TreeView><TreeViewItem Header"人事部"/><TreeViewItem Header"技术部"><TreeViewItem Header"技术部-1&q…

低代码平台:助力企业数字化转型的利器

正文&#xff1a; 在数字化时代的浪潮中&#xff0c;企业需要快速适应市场变化和技术进步。传统的软件开发方法往往由于开发周期长、成本高和对技术人员的依赖程度高&#xff0c;难以满足企业的快速响应需求。此时&#xff0c;低代码平台&#xff08;Low-Code Platform&#x…

干货分享|分享一款微软出品的工作效率神器 PowerToys

工具介绍&#xff1a;Microsoft PowerToys 是一组实用工具&#xff0c;可帮助高级用户调整和简化其 Windows 体验&#xff0c;从而提高工作效率。 安装步骤&#xff1a;直接打开微软商店安装即可&#xff0c;并且可以保证下载到最新版本。 功能介绍&#xff1a; 高级粘贴 高级…

js react 笔记 2

起因&#xff0c; 目的: 记录一些 js, react, css 1. 生成一个随机的 uuid // 需要先安装 crypto 模块 const { randomUUID } require(crypto);const uuid randomUUID(); console.log(uuid); // 输出类似 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d 2. 使用 props, 传递参数…

[uniapp/wx小程序] 关于cover-view滚动/点击穿透问题的解决方案/cover-view 的坑

情况&#xff1a;如果在原生组件上&#xff0c;搞了一些弹窗、覆盖层、操作栏等等的东西&#xff0c;有层级的情况&#xff0c;就会出现事件穿透的问题 问题&#xff1a;自然会想到官方给出的解决方案&#xff1a;使用cover-view。但有时穿透问题虽然解决了&#xff0c;但会出…

【NanoEdgeAIStudio】初次体验

本文前言 NanoEdge ai Studio是ST提供的免费软件&#xff0c;可以轻松地将ai添加到任何Arm Cortex-M MCU上运行的任何嵌入式项目中。官网首页&#xff1a;NanoEdge AI Studio&#xff0c;官方文档&#xff1a;AI:NanoEdge AI Studio。官方文档写的很详细&#xff0c;建议观看。…

Python 从入门到实战12(流程控制-跳出循环语句)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;通过熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们通过举例学习了流程控制语句中的循环语句。今天继续讨…

【数据结构】顺序表和链表——链表(包含大量经典链表算法题)

文章目录 1. 单链表1.1 概念与结构1.1.1 结点1.1.2 链表的性质1.1.3 链表的打印 1.2 实现单链表1.3 链表的分类1.4 单链表算法题1.4.1 移除链表元素1.4.2 反转链表1.4.3 链表的中间结点1.4.4 合并两个有序链表1.4.5 链表分割1.4.6 链表的回文结构1.4.7 相交链表1.4.8 环形链表1…

【运维监控】influxdb 2.0+grafana 监控java 虚拟机以及方法耗时情况(完整版)

关于java应用的监控本系列有文章如下&#xff1a; 【运维监控】influxdb 2.0telegraf 监控tomcat 8.5运行情况 【运维监控】influxdb 2.0grafana 监控java 虚拟机以及方法耗时情况 【运维监控】Prometheusgrafana监控tomcat运行情况 【运维监控】Prometheusgrafana监控spring b…

软考科目傻傻分不清?一次搞懂各科目考核内容!小白不再纠结!

2024年下半年软考报名已经逐步进入尾声了&#xff0c;大部分考生都已完成报名&#xff0c;但有不少小白因为是第一次报考&#xff0c;对各科目傻傻分不清&#xff0c;导致报错了科目…… 这种情况很可能会影响考试&#xff0c;浪费了一次报考机会。而为了尽量避免这一情况再发生…

个人简历 (自己设计的)

欢迎大家来观看。 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" co…

国产“小钢炮”MiniCPM3-4B:小参数,大能量!

前沿科技速递&#x1f680; 在 AI 大模型浪潮中&#xff0c;国内厂商面壁智能再次突破&#xff0c;推出了其最新的“小钢炮”系列——MiniCPM 3.0。这款全新模型不仅实现了在移动设备上运行 GPT-3.5 级别的能力&#xff0c;而且具备超强的推理、检索与代码解释功能。MiniCPM 3.…

Python必知必会:程序员必须知道的22个Python单行代码!

今天给大家分享24个每个Python程序员都必须知道的单行代码&#xff0c;帮你写出更简洁、更优雅、更高效的代码。 1. 列表推导式 列表推导式&#xff08;List Comprehensions&#xff09;可以提供一种简洁的方式创建列表。相较于传统的循环&#xff0c;列表推导式更高效、可读…

240909-ChuanhuChatGPT集成Ollama的环境配置

A. 最终效果 B. 需求文件 requirements.txt (至少需要安装这个&#xff0c;具体参见官网)requirements_advanced.txt &#xff08;如果安装了Ollama&#xff0c;并且可以进行对话&#xff0c;可以不需要安装&#xff0c;具体参见官网&#xff09;requirements_succcess.txt&am…

Qt5.4.1连接odbc驱动操作达梦数据库

Qt5.4.1连接odbc驱动操作达梦数据库 1 环境介绍2 Qt5.4.1 安装2.1 图形化界面安装Qt5.4.12.2 配置Qt5.4.1 环境变量2.3 Qt5.4.1 生成 libqsqlodbc.so 并配置2.3.1 生成Makefile2.3.2 查看 libqsqlodbc.so 文件并配置 3 配置Qt测试用例4 达梦数据库学习使用列表 1 环境介绍 CPU…

SAP加密解密功能设计

SAP加密解密功能设计 【场景】与外围系统对接时&#xff0c;出于信息安全等因素&#xff0c;经常需要对传输的信息做加密解密控制。 1. 公用类zcl_aes_utility *----------------------------------------------------------------------* * CLASS ZCL_AES_UTILITY DEFI…

Ubuntu 22.04 安装增强功能失败

安装的时候&#xff0c;总是失败&#xff0c;然后根据提示查看 log 猜测可能需要安装g12 ubuntu22.04.2 目前(until 23.6.25) gcc 的默认版本是 11.3.0, 有些 c 的特性无法享用.Launchpad toolchain test buildsLanchpad toolchain build 将 Lanchpad 上的 PPA 加入到 apt 搜…

用Python包加速你的视频剪辑:Tailor工具全解析

Tailor是一款视频智能裁剪、视频生成和视频优化的视频剪辑工具。目前的目标是通过人工智能技术减少视频剪辑的繁琐操作&#xff0c;让普通人也能简单实现专业剪辑人的水准&#xff01;长远目标是让视频剪辑实现真正的AIGC&#xff01; 当然&#xff0c;这是一份Python包的列表…

分组注解和自定义注解及分页查询

自定义注解的使用步骤 案例&#xff1a; 此时state需要进行的校验使用普通方式无法满足&#xff0c;需要我们根据需求进行自定义注解 创建一个注解 Documented//元注解 Retention(RetentionPolicy.RUNTIME)//元注解 Constraint(validatedBy {StateValidation.class}//指定提供…

DPDK基础入门(七):网卡性能优化

DPDK的轮询模式 运行在操作系统内核态的网卡驱动程序基本都是基于异步中断处理模式&#xff0c;而DPDK采用了轮询或者轮询混杂中断的模式来进行收包和发包。 任何包进入到网卡&#xff0c;网卡硬件会进行必要的检查、计算、解析和过滤等&#xff0c;最终包会进入物理端口的某…