深圳华强北电子产品批发市场/企业seo顾问服务
文章目录
- 准备
- Task #1-Read/Write Page Guards
- BasicPageGuard/ReadPageGuard/WritePageGuard
- Upgrade
- Wrappers
- Tests
- Task #2-Extendible Hash Table Pages
- Hash Table Header Pages
- **成员变量:**
- **方法实现:**
- Hash Table Directory Pages
- **成员变量:**
- **方法实现:**
- Hash Table Bucket Page
- **成员变量:**
- 方法实现
- Tests
- Task #3-Extenable Hashing Implementation
- - \[✅] Empty Table
- - \[✅] Header Indexing
- - \[✅] Directory Indexing
- - \[✅] Bucket Splitting
- - \[ ] Bucket Merging
- - \[ ] Directory Growing
- - \[ ] Directory Shrinking
- Tests
- Task #4-Concurrency Control
- PageGuard
- `ExtendibleHTableTest`
- ExtendibleHTableConcurrentTest
- InsertTest1
- BUGs
- InsertTest2
- DeleteTest1
- DeleteTest2
- MixTest1
- MixTest2
撰写本文的目的:记录本人在不参考其他任何形式的解决方法(思路/源码)、仅靠课程提供的资源(课本/参考资料)和
Discord
中
high level
的讨论的情况下,独立完成该课程的过程。
欢迎大家和我讨论学习中所遇到的问题。
ZiHao’s Blog
由于gradescope
中对non-cmu students
还未开放Project#2
,本文方法仅通过了本地测试,极有可能有错误(并发访问)
Project #2: Extendible Hash Index
先记录完成的过程,然后再总结和思考
准备
Due:四个星期左右(通过本地测试-4天左右+通过线上测试-待定)
在开始完成该项目之前,首先确保两件事
- 确保Project#1的代码实现是正确的,最好多提交几次,因为测试用例可能会有不同
- 一定要先从原bustub仓库pull最新的代码,不然可能会缺少一些给定的实现
实验环境:
- MacOS
- CLion/VSCode
Task #1-Read/Write Page Guards
-
数据成员:存储指针
- 指向BPM
- 指向Page对象
-
析构函数:确保当BasicPageGuard对象离开作用域的时候:自动调用
UnpinPage
-
方法成员:除此之外,需要提供方法使得能够手动unpin
-
数据成员:writer-reader latch
- 可以尝试调用Page中的相关方法
-
方法成员:能够在对象离开作用域时,自动释放latch
BasicPageGuard/ReadPageGuard/WritePageGuard
对于BasicPageGuard
-
PageGuard(PageGuard &&that)
: Move constructor.-
参考C++Primer
- 移动构造的时候从给定对象中窃取资源而非拷贝资源,即移动构造函数不分配任何新内存
- 需要确保移后源对象销毁是安全的
-
-
operator=(PageGuard &&that)
: Move assignment operator. -
需要处理移动赋值对象是自身的情况
- 直接返回*this
-
否则,需要处理原page
- 按需调用Drop
- 类似于移动构造
- 按需调用Drop
-
Drop()
: Unpin- 先clear
- 再调用UnpinPage
-
~PageGuard()
: Destructor.-
需要先判断是否已经手动Drop
- 若否则直接调用Drop
-
-
read-only
和write data
APIs- 分别为
As
和AsMut
As
以const
修饰符返回Page内部的dataAsMut
则不然,并且注意AsMut
会将PageGuard的成员变量is_dirty
置为true
- 可以在编译时期检查
data
用法是否正确:- 例如,在实现Task3或Task4的
Insert
时,你可能认为某个部分仅仅是查阅了HeaderPage
,因此以As
返回,却没想到其实有可能在HeaderPage
中无相应DirectoryPage
后,会修改HeaderPage
。例子可能不大恰当
- 例如,在实现Task3或Task4的
- 分别为
对于ReadPageGuard
-
移动构造和移动赋值都可以使用std::move完成
- std::move()移动赋值时,会对赋值guard调用析构函数并调用Drop,因此不必担心赋值后移后源对象会对page造成影响
-
需要注意Drop中资源的释放顺序,需要在Drop BasiPage之前释放RLatch,
-
可能会因为Unpin调用了RLatch而死锁
-
更重要的原因:先UnpinPage的话,可能会被replacer evit
-
-
需要在析构函数中判断是否已经手动drop/移动赋值/移动构造过,避免重复Drop导致重复释放Latch
对于WritePageGuard:同上
Upgrade
guarantee that the protected page is not evicted from the buffer pool during the upgrade
-
UpgradeRead()
: Upgrade to aReadPageGuard
-
UpgradeWrite()
: Upgrade to aWritePageGuard
目前这两个函数我都没有使用到,或者说是不知道该如何实现以及使用:
- 如何实现?我本以为防止evict只需要将page的pin_count_++,但是并PageGuard不是Page的friend class,无法直接访问Page的私有成员
- 如何使用?我能想到该函数存在的原因,是新建一个需要修改的DirectoryPage或者BucketPage,但是没有
NewWritePageGuard
和NewReadPageGuard
函数的实现,只能NewPageGuard
之后立刻Upgrade
。- 我认为:实际上该线程新建的
Page
目前只能该线程自己访问,并不需要使用Guard
来保护啊 - 因此我在
InsertToNewDirectory
和InsertToNewBucket
中都只是用了BasicPageGuard
并且调用了AsMut
,而未使用WritePageGuard
。并且这是能够通过本地测试的
- 我认为:实际上该线程新建的
Wrappers
FetchPageBasic(page_id_t page_id)
FetchPageRead(page_id_t page_id)
FetchPageWrite(page_id_t page_id)
NewPageGuarded(page_id_t *page_id)
注释中说明得足够清晰,不再赘述
Tests
Task #2-Extendible Hash Table Pages
这里主要实现三层可扩展哈希表的三个部分,如上图所示:
- Header Page:
- 课本中的2-Level并没有该部分,该部分的max depth/prefix(例如上图中的2)是固定的
- 主要是用来索引能够索引到存储key的
BucketPage
位置的Directory Page
在Header Page
中的位置(比较拗口)- 通过
HashToDirecotryIndex
实现
- 通过
HeaderPage
的优点(文档中提到):- More Direcotry Pages -> More Bucket Pages -> More Keys
- 并且由于
Latch Crabbing
的并发策略,使得Header Page
的Latch
很快的被释放
- Directory Page
- 与课本中一致
- global depth = hash prefix:三个作用
- 用来限制某个时刻可以使用的Directory条目数量 2 g l o b a l d e p t h 2^{global depth} 2globaldepth 个
- 用来获得哈希值从LSB开始的global_depth个位,作为在dierctory中的索引,找到key所在的bucket
HashToBucketIndex
实现
- 并且在某个bucket满时,通过比较
global depth
和local depth
来决定如何处理split
- local depth = bucket hash prefix
- 通过比较和global_depth的关系,判断指向当前bucket的指针数量,分裂时如何处理
- global depth = hash prefix:三个作用
- 与课本中一致
- Bucket Page
- 以数组的形式存储
<key, value
- 注意本项目并不会处理
non-unque key
,因此对于插入相同的key直接返回false(Insert函数)
- 以数组的形式存储
Task2中相关源码的注释并没有很详细,需要自己根据本地测试来判断该函数具体完成了什么工作
- 可以在实现
Header Pages
和Directory Pages
的时候,通过HeaderDirectoryPageSampleTest
来测试或者Debug - 实现
Bucket Pages
的时候,通过BucketPageSampleTest
测试 - 例如:
HashToDirectoryIndex
是通过hash value的max_depth
个MSB求得的
Hash Table Header Pages
成员变量:
directory_page_ids
:page_id(4B)的数组
-
元素个数:1<<9
- 即512个
-
占用内存:512*4 = 2048
max_depth_
: 通过page_id(32位)哈希值的高max_depth_位,来判断page_id在directory_page_ids_中的位置
- 占用内存:4B
方法实现:
- [✅] HashToDirectoryIndex(uint32_t hash)
- 通过测试可以看到,实际上该函数是将hash的高max_depth_位,作为directory page id在数组directory_page_ids_的索引
- 将hash向右移动
32-max_depth_
位,可以获得高max_depth_
位对应的uint32_t表示 Hint
: 考虑max_depth_
为0的情况,实际上对于4B的整型右移32
位是undefined
?
- [✅] MaxSize():
Get the maximum number of directory page ids the header page could handle
-
由于directory_page_ids中每个条目只能存放一个page id元素,因此directory_page_ids_最大能存入
HTABLE_HEADER_ARRAY_SIZE
directory page id -
而
max_depth_
- 对于线性探测解决冲突的哈希表:会决定
directory_page_ids
的大小 - 不使用线性探测解决冲突:似乎并不会影响
directory_page_ids_
的大小,
- 对于线性探测解决冲突的哈希表:会决定
-
根据题目要求,
Header Pages
并没有使用线性探测,因此需要返回max_depth_
能表示数的数量和HTABLE_HEADER_ARRAY_SIZE
之中的较小值
Hash Table Directory Pages
成员变量:
max_depth_
:
- 4B
- Header Page的directory page id数组中,所有的directory page拥有相同的max_depth值,代表一个directory能够用的掩码的最大位数
global_depth_
:
-
4B
-
类似于: 课本中的bucket address table的global prefix,用来控制当前table使用条目的数量,上限是2^max_depth
-
简而言之:global_depth用来掩码hash value,以获得存储key的bucket在directory 中的索引
-
global_depth<=max_depth_
local_depth_s
:数组
- 1B * (Size of array of Bucket page id )
- 类似于:课本中每个bucket持有的local prefix,用来按需生成bucket,进行local prefix后拥有相同值的entry指向同一个bucket
- 简而言之:local_depth用来掩码,使得确定其在哪个bucket page中
bucket_page_ids_
- 存储bucket page id的数组
方法实现:
- [✅] Init
:
- 将global depth和local depth初始化0
- bucket page id初始化为-1或者其他特殊标记
- [✅] HashToBucketIndex
:
- 类似于
Header Page
中的HashToDirectoryIndex
,只不过掩码长度为global_depth_
,并且是将Hash值的低global_depth_
位(从LSB开始)处理作为bucket在directory中的索引 - 像测试中直接
%Size()
是极好的,但是我一开始脑子没转过来,- 一直想用位操作。。。🐽
- [✅] GetSplitImageIndex
:
-
分两种情况:
- local_depth_ > global_depth_:代表后续需要double directory
- local_depth_ <= global_depth_
-
观察得到,为了获得directory扩展后当前bucket_idx分裂后映像的索引,只需要将bucket_idx的第新global_depth_位取反即可
-
两种情况可以使用同一种位运算来解决
-
只需要对原进行split的bucket_idx进行如下位运算
- 第一种情况:需要double directory
- 第global_depth_位与1异或
- 第二种情况:不需要double
- 第global_depth_-1位与1异或
- 其他位与0异或
- 第一种情况:需要double directory
-
- [✅] SetLocalDepth
-
同上,分两种情况
- 先根据local_dpth和global_depth的关系,获得split_bucket_idx
- 如何将两个bucket的local_depth同时设置为新的即可
- [✅] IncrGlobalDepth
-
需要找到当前directory可用的条目中,local_depth小于等于当前global_depth的项:
- 使得其在double后的split_entry拥有相同的bucket page id和local_depth
-
global_depth++
-
Hint: global_depth <= max_depth
- [✅] DecrGlobalDepth
- 直接将index在区间[2^{global_depth-1}, 2^{global_depth}-1]的两个数组元素初始化为{-1, 0}
- [✅] GetGlobalDepthMask
:
- 通过注释我们可以知道,
global_depth_
是用于生成从哈希值的LSB
开始的global_depth_mask
- 而
Header Page
中的max_depth_
则是用于生成MSB
的掩码
- [✅] GetLocalDepthMask
:
- 同理
- [✅] CanShrink
-
判断是否存在local_depth与global_depth相同
-
如果没有,则说明所有<bucket_idx, split_bucket_idx>所包含的bucket page id都相同
- 因此table可以去除冗余部分,缩小一倍
-
Hash Table Bucket Page
成员变量:
size_
:The number of key-value pairs the bucket is holding
max_size_
:The maximum number of key-value pairs the bucket can handle
array_
:An array of bucket page local depths
方法实现
Init
:
-
对max_size_初始化
-
对于array_中的每一个pair<Key, Value>进行初始化
-
注意需要为Key和Value都指定一个特殊值,表示该部分为无效
-
可以直接使用构造列表,来直接构造模版类的临时对象:
- Key可以使用{-1}来与测试中的i==0区别,Value可以直接使用{}因为RID的默认构造函数会使用-1来表示无效
-
或者使用模版参数类型构造
- 同理
-
-
Lookup
:
-
使用模版类对象cmp的重载函数(),来比较Key是否相同
- 返回0表示相同
注意Insert和Remove之后需要对size进行增减
Tests
Task #3-Extenable Hashing Implementation
课本中的实现步骤:Extendible Hash Table
最好也是参考着测试样例来实现
Each extendible hash table header/directory/bucket page corresponds to the content (i.e., the
data_
part) of a memory page fetched by the buffer pool.Every time you read or write a page, you must first fetch the page from the buffer pool (using its unique
page_id
), reinterpret cast it the corresponding type, and unpin the page after reading or writing it.We strongly encourage you to take advantage of the
PageGuard
APIs you implemented in Task #1 to achieve this.
假设:
- 只支持unique keys
注意:
-
需要使用Task2中的三种Page类和meta data(page id, global/local depth)来实现基于disk的hash table
-
不允许使用内存数据结构例如unordered_map
-
take a
Transaction*
with default valuenullptr
.template <typename KeyType,
typename ValueType,
typename KeyComparator> -
三种类型在Task #2的
Bucket Pages
中都见过:KeyType
:GenericKey
ValueType
:RID
KeyComparator
: 比较两个Key的大小
实现bucket splitting/merging and directory growing/shrinking
- [✅] Empty Table
- 构造函数中新建一个Header Page,并Init
- 通过实现辅助函数
InsertToNewDirectory
和InsertToNewBucket
来实现按需生成Buckets
- [✅] Header Indexing
- Hash(key)
- 对hash value调用HashToDirectoryIndex
- [✅] Directory Indexing
- Hash(key)
- 对hash value调用HashToBucketIndex
- [✅] Bucket Splitting
-
按照课本上的步骤来实现即可
-
可以通过实现源码中给定的工具函数
UpdateDirectoryMapping
来辅助实现- 可能该函数内部调用了
MigrateEntries
函数,但是我并没有实现,直接在UpdateDirectoryMapping
中实现了Rehash操作 - **Hint:**该函数如果直接在Insert中调用的话函数签名中可以自己修改并多传入两个
ExtendibleHTableBucketPage
old_bucket_page
:需要进行分裂,并rehash的bucketnew_bucket_page
:新建的bucket- 这样可以不必重新
FetchPage
- 可能该函数内部调用了
-
- [ ] Bucket Merging
- 似乎没必要实现
- [ ] Directory Growing
- 可实现可不实现
- [ ] Directory Shrinking
- 只有当所有的local_depth_都小于global_depth时才进行
- 在
Task2
中实现了相关操作
本地测试中似乎并没有测试到Bucket Merging
, Directory Growing
和Directory Shrinking
,因此无法验证实现的正确性
Tests
Task #4-Concurrency Control
Latch Crabbing
- The thread traversing the index should acquire latches on hash table pages as necessary to ensure safe concurrent operations, and should release latches on parent pages as soon as it is possible to determine that it is safe to do so.
We recommend that you complete this task by using the
FetchPageWrite
orFetchPageRead
buffer pool API
Note: You should never acquire the same read lock twice in a single thread. It might lead to deadlock.
Note: You should make careful design decisions on latching.
- Always holding a global latch the entire hash table is probably not a good idea.
PageGuard
Insert
- 的BasicPage尽量替换WritePageGuard,先不用Read;
GetValue
:
- 可以全部使用ReadGuard
Remove
:
- 只需要对bucket page使用write guard
需要使用Latch Crabbing
策略来尽快而又安全地释放父Page的Latch
-
Crabbing:
-
先获得header page的page guard
-
然后尝试获得directory page的page guard
- 若成功获得,确保不会用到header时,再释放header page的page guard
-
尝试获得bucket page的page guard
- 若成功获得,确保不会用到directory时,释放directory page的page guard
-
ExtendibleHTableTest
先尝试通过单线程,验证实现Insert
,Remove
和GetValue
不会使得一个线程对同一个page死锁
ExtendibleHTableConcurrentTest
InsertTest1
BUGs
-
- [✅] BUG
-
在Project #1中图方便,在NewPage直接使用了一把函数粒度的递归锁lock_guard
-
导致有一种死锁的可能:
-
线程一先调用Insert,并通过调用FetchWritePage获得了page0(即header page )的WLatch
-
线程二后调用Insert,也尝试通过调用FetchWritePage获得page0,但是进入到FetchPage后尝试获取page0的WLatch失败,只能waiting
- 注意,此时线程二拿到了BPM的递归锁lock_guard
-
线程一继续完成Insert:尝试InsertToNewDirectory时,内部也尝试调用NewWritePage获得bpm的递归锁。
-
最终导致了DeadLock
-
-
solution: 将lock_guard换为unique_mutex,并手动在获得Page的Latch之前解锁,在Unlatch之后加锁
-
- [✅] 新BUG
-
描述:使用该方法会导致BPM的并发问题,可能是unlock之后被其他线程修改了相应的部分
-
solution: 能确保BPM100分
- 不使用递归锁,不主动unlock,
- 只对NewPage, FetchPage和DeletePage加锁,
- 并且在FetchPage中处理已经在bufferpool情况的分支中不对Page加锁
-
- [✅] 新BUG
-
描述:
-
线程一:Insert->WritePageGuard.Drop->guard.Drop->Unpin(is_dirty=true)——waiting在Unpin获得BPM的latch步骤
-
线程二: Insert->FetchWritePageGuard->FetchPage——正在FetchPage中尝试读出某页的数据
- 报出异常,读出的位置为空数据
-
-
尝试LogOut:
- page id>50即超过了buffer pool的大小,某次新建page会导致evcit时,会有之前某个dirty page并没有flush回disk
- 某次NewPage时,并没有将该dirty page flush回disk,可能是UnPinPage时没有标志is_dirty_
-
可能solution:
- 不使用UpgradeWrite,该函数实现有问题,并没有在Upgrade期间对pin_count_++,导致drop中Unpin中不会将其的is_dirty写入到page的metadata中
-
-
- [✅] 新BUG
-
描述:
- 死锁
-
尝试Log Out线程编号:可以使用
std::hash(std::this_thread::get_id())
返回当前线程的id(hash后)-
-
Debug过程中发现
UnpinPage
函数在unpin page0(即header page),对其内部使用Page的读写锁是多此一举的,由于判断pin_count的目的就是判断是否有多线程正在使用该Page(读或者写)。通过BPM的线上测试也能证实这一点- 并且将Page锁去除后,该BUG消失
-
这时才想起来
header_page_guard.AsMut
函数内部会访问Page的Data -
推测是两个线程在UnpinPage和AsMut中思索了???
-
-
solution:
- 去除UnpinPage内部的Page锁
-
-
-
-
-
- [✅] 误以为不会有non-unique key,原先处理由non-unique key导致的插入失败,直接throw了
-
For this semester, the hash table is intend to support only unique keys. This means that the hash table should return false if the user tries to insert duplicate keys.
-
solution: 返回false
-
InsertTest2
Pass in one go !
DeleteTest1
in one go +2 !!
DeleteTest2
in one go +3 !!!
MixTest1
in one go +4 !!!
MixTest2
in one go +5 !!!
相关文章:

Project#2: Extendible Hash Index
文章目录 准备Task #1-Read/Write Page GuardsBasicPageGuard/ReadPageGuard/WritePageGuardUpgradeWrappersTests Task #2-Extendible Hash Table PagesHash Table Header Pages**成员变量:****方法实现:** Hash Table Directory Pages**成员变量&#…...

Emscripten + CMakeLists.txt 将 C++ 项目编译成 WebAssembly(.wasm)/js,并编译 Html 测试
背景:Web 端需要使用已有的 C 库(使用 CMake 编译),需要将 C 项目编译成 WebAssembly(.wasm) 供 js 调用。 上篇文章《Mac 上安装 Emscripten》 已讲解如何安装配置 Emscripten 环境。 本篇文章主要讲解如何将基于 CMakeLists 配…...

MATLAB中preparets函数用法
目录 语法 说明 示例 准备开环和闭环网络的数据 preparets函数的功能是为网络模拟或训练准备输入和目标时间序列数据 语法 [Xs,Xi,Ai,Ts,EWs,shift] preparets(net,Xnf,Tnf,Tf,EW) 说明 [Xs, Xi, Ai, Ts, EWs, shift] preparets(net, Xnf, Tnf, Tf, EW) 这个函数接受…...

ARM 版 OpenEuler 22.03 部署 KubeSphere v3.4.0 不完全指南续篇
作者:运维有术 前言 知识点 定级:入门级KubeKey 安装部署 ARM 版 KubeSphere 和 KubernetesARM 版 KubeSphere 和 Kubernetes 常见问题 实战服务器配置 (个人云上测试服务器) 主机名IPCPU内存系统盘数据盘用途ks-master-1172.16.33.1661650200KubeSp…...

react官网
应急方案 – React 中文文档 (docschina.org) 正版卡死版 Hooks FAQ – React (reactjs.org) 英文流畅版 应急方案 – React 中文网 (nodejs.cn) 盗版流畅版(翻译有稍稍的问题) http://www.react-cn.com/index.html 黄版...

前端css介绍
CSS介绍 CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素。 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染)。 CSS语法 CSS实例 每个CSS样式由两个组成部分:选择器和…...

MySql创建索引
在MySQL中,可以使用CREATE INDEX语句来创建索引。以下是创建索引的基本语法: CREATE INDEX index_name ON table_name (column1, column2, ...);其中,index_name是索引的名称,可以自定义(也可以不指定索引名称&#x…...

前后端分离vue+springboot家庭理财账单财务管理系统
项目介绍: 该系统能够管理家庭收入支出,并且能直观得表现收支状态。主要功能包括用户管理、收支管理、财务管理、统计收支情况等功能。 技术栈: 后端: SpringBoot,Sa-Token,MyBatis-Plus,MyB…...

LeetCode:2003. 每棵子树内缺失的最小基因值(C++)
目录 2003. 每棵子树内缺失的最小基因值 题目描述: 实现代码与解析: dfs 启发式合并 原理思路: 2003. 每棵子树内缺失的最小基因值 题目描述: 有一棵根节点为 0 的 家族树 ,总共包含 n 个节点,节点编…...

React Hooks之useContext使用
官方文档写道:在组件的顶层调用 useContext 来读取和订阅 context。 我理解就是一个“全局变量”的概念。它可以用来声明一个变量,然后在各个组件中使用,避免了props一级一级往下传,当然使用场景有限,比如设置一个主题…...

多模态对比语言图像预训练CLIP:打破语言与视觉的界限
项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实…...

使用s3cmd访问S3存储 -【真实案例】
背景 项目中使用到了 S3 存储(基于华为云 OBS),并且在应用服务器上开通了到 S3 存储的防火墙。 👉 目标:在应用服务器上验证 S3 存储是否通畅可用。 👉 选型:经过分析,发现在 Linux 下可以使用 s3cmd 来访问 S3 存储。 s3cmd 简介 s3cmd 是一个开源免费的、基于 P…...

51单片机复位电容计算与分析(附带Proteus电路图)
因为iC x (dU/dt).在上电瞬间,U从0变化到U,所以这一瞬间就是通的,然后这就是一个直流回路,因为电容C直流中是断路的,所以就不通了。 然后来分析一下这个电容的电压到底是能不能达到单片机需要的复位电压。 这是一个线性电容&…...

前端性能瓶颈崩溃项目?Webpack助力解决!
🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 ⭐ 专栏简介 📘 文章引言 一、背…...

纷享销客BI,助力企业激活数据价值,科学企业决策
10月25日上午,国家数据局正式挂牌成立,这标志着我国数字经济发展将进入新的发展阶段,也将有力促进数据要素技术创新、开发利用和有效治理,以数据强国支撑数字中国的建设。伴随数据作为企业新的生产要素的意义不断凸显,…...

SpringBoot整合阿里云OSS对象存储
文章目录 1、OSS介绍及开通1.1、阿里云OSS简介1.2、开通OSS 2、创建存储空间bucket及密钥获取2.1、创建存储空间2.2、获取密钥 3、OSS快速入门案例4、在springboot项目中整合4.1、将oss配置放到yml文件中4.2、创建Oss属性类,接收yml文件中的属性4.3、封装文件上传功…...

【ES专题】ElasticSearch快速入门
目录 前言从一个【搜索】说起 阅读对象阅读导航笔记正文一、全文检索1.1 什么是【全文检索】1.2 【全文检索】原理1.3 什么是倒排索引 二、ElasticSearch简介2.1 ElasticSearch介绍2.2 ElasticSearch应用场景2.3 数据库横向对比 三、ElasticSearch环境搭建3.1 Windows下安装3.2…...

案例分析真题-质量属性
案例分析真题-质量属性 2009 年真题 【问题1】 【问题2】 2011 年真题 【问题1】 骚戴理解:首先要知道这样的题目没有可靠性,只有可用性,更没有容错性,这里我(3)写成了i,而不是f,仔…...

微信小程序面试题之理论篇
本文内容,来源于极客学院的分享,这里只做引用。 说说你对微信小程序的理解?优缺点? 背景 小程序与H5 优缺点 优点:缺点: 说说微信小程序的生命周期函数有哪些? 应用的生命周期页面的生命期组件的生命周期执行过程 应…...

C++前缀和算法的应用:统计上升四元组
C前缀和算法的应用:统计上升四元组 本文涉及的基础知识点 C算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 给你一个长度为 n 下标从 0 开始的整数数组 nums ,它包含 1 到 n 的所有数字,请你返回上…...

华泰证券:新奥能源:零售气待恢复,泛能与智家仍是亮点
来源:猛兽财经 作者:猛兽财经 猛兽财经获悉,由于新奥能源(02688)发布三季度经营数据: 1-3Q23:天然气零售量yoy-4.7%,燃气批发量yoy17.6%,综合能源销量yoy34.2%ÿ…...

FPGA与ASIC有什么差异?二者该如何选用?
前言 对于一个数字电路的新手来说,这可能是会经常遇到的一个问题:FPGA和ASIC之间的区别是什么? 接下来本文将尝试讲解 “什么是FPGA?” 和 “什么是ASIC?”,然后讲述一些关于FPGA和ASIC的问题,例如它们之间…...

Kotlin run 用法
Kotlin 中的 .run 函数可以用于不同的场景,下面是一些常见的用法: 执行代码块并返回结果: val result run {// 在这里编写一些代码逻辑// 返回最后一个表达式的结果"Hello, Kotlin" }println(result) // 输出:Hello, …...

iZotope RX 10(音频修复和增强工具)
iZotope RX 10是一款音频修复和增强软件,主要特点包括: 声音修复:iZotope RX 10可以去除不良噪音、杂音、吱吱声等,使音频变得更加清晰干净。音频增强:iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…...

MES 价值点之数据追随
在现代制造业中,数据追溯已经越来越得到重视,特别是那些推行精益生产的企业重要性就更加突出了,而制造执行系统(MES)作为一种关键的生产管理工具,是能很好的为制造企业提供数据追溯功能。今天,和…...

yolo8制作自己的数据集训练和预测分割
一、训练coco128-seg数据集,增加一个类别 coco128-seg数据集下载: github链接 csdn链接 1、修改两个配置文件 (1)、修改"E:\python\ultralytics-main\ultralytics\cfg\datasets\coco128-seg.yaml"路径下的coco128-seg.yaml数据集配置文件,可以拷贝出来 修改数…...

分享一下怎么做一个同城配送小程序
如何制作一个同城配送小程序:功能特点、使用指南及未来展望 一、引言 随着互联网的快速发展,人们对于生活服务的需求越来越高。同城配送作为连接消费者与商家的桥梁,越来越受到人们的关注。本文将详细介绍如何制作一个同城配送小程序&#…...

Qt 中model/View 架构 详解,以及案例实现相薄功能
model/View 架构 导读 我们的系统需要显示大量数据,比如从数据库中读取数据,以自己的方式显示在自己的应用程序的界面中。早期的 Qt 要实现这个功能,需要定义一个组件,在这个组件中保存一个数据对象,比如一个列表。我们对这个列表进行查找、插入等的操作,或者把修改…...

提高微星笔记本Linux下散热性能,MSI-EC 驱动新补丁发布
导读近日消息,今年早些时候,Linux 6.4 中添加了 MSI-EC 驱动程序,允许对 Linux 系统微星笔记本电脑进行更多控制。 MSI-EC 驱动程序近日迎来新补丁,为微星笔记本带来 Cooler Boost 功能。该功能允许提高笔记本电脑的风扇转速&…...

Apache Doris (五十): Doris表结构变更-动态分区(2)
🏡 个人主页:IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 🚩 私聊博主:加入大数据技术讨论群聊,获取更多大数据资料。 🔔 博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频 目录...