学习型索引结构--ALEX: An Updatable Adaptive Learned Index 论文代码复现记录(基于VS2022)

ALEX(An Updatable Adaptive Learned Index):一种可更新的自适应学习索引


ALEX的基本结构

  • 基于B+树和RMI结构改进,每个结点上有一个线性回归模型和一部分连续存储空间(数组)
  • 非叶节点(内部结点)的数组存储叶节点的指针。
  • 叶结点(数据结点)有两个数组,一个用来存储关键字,另一个保存关键字对应的其他信息。其中关键字数据利用Gapped Array(GA)要保留一些间隔,用来提高数据动态更新时的性能。
  • 结点上的模型用来拟合数组中的数据分布,从而预测输入的Key的位置
  • 每个结点能够在数据更新时根据情况动态的分裂和合并。

 

ALEX的工作原理

查询
  • 根节点开始,我们迭代地使用该模型来“计算”指针数组中的一个位置,并且我们跟随指针到下一级的子节点,直到我们到达一个数据节点
  • 通过构造,内部节点的模型具有完美的准确性,不存在误差。我们使用数据节点中的模型来预测搜索关键字在数组中的位置,如果预测有误则从预测位置开始进行指数搜索。
插入
  • 对于数据插入,找到插入位置的方式同查询一样
  • 当被插入的数据结点的关键字数组非满时,为了找到新元素的插入位置,使用数据节点中的模型来预测插入位置。如果预测的位置不正确(在此位置插入会破坏关键字的大小排序),则进行指数搜索以找到正确的插入位置。如果预测位置是一个间隙,则进行插入。
  • 如果预测位置不是间隙,则将附近元素向最近的间隙方向移动一个位置,在插入位置形成一个间隙。然后,我们将元素插入到新创建的间隙中。插入关键字后将关键字对应的其他数据放入工作负载空间中。
  • 当被插入的数据结点的空间已满时,需要对结点进行扩展或者分裂两种操作。通过一个代价函数来评估两种操作的代价,选择代价较小的操作。将其转化为在非满结点中插入的情况。
删除/更新/其他操作
  • 查找要删除的关键字的位置,然后删除它及其附加数据。如果一个数据节点中空余间隙太多,应当收缩该数据节点(与扩展数据节点相反),以避免低空间利用率。
  • 关键字的更新可通过通过组合插入和删除操作来实现的。

相关配置及代码复现

1、下载

  这里我直接解压到了C盘,文件路径后面会用到

GitHub - microsoft/ALEX: A library for building an in-memory, Adaptive Learned indEX

2、cmake安装

  由于我之前没有安装和配置cmake,于是现下现配。具体的下载安装可以自行搜索,安装成功之后“win+R”后,显示如图即为安装成功。

3、打开cmd构建项目

   win+R打开cmd,cd到项目所在的文件夹,然后运行下面的命令。

mkdir build//在项目文件中创建一个文件夹,用来build工程文件
cd build
cmake ..//执行项目文件夹里面CMakeLists.txt所在的目录

  这里项目名为ALEX-master,CMakeLists.txt所在的目录地址为:"C:\ALEX-master\ALEX-master\CMakeLists.txt"。

  输入完以上命令后,CMake工具就会在背后构建这个项目,构建完成后,我们打开build文件夹。注意,不同构建工具生成的文件不同。

执行后的结果:

这样就是成果构建啦,然后我们在项目文件里打开build文件夹。

4、打开VS-运行项目

  我们打开.sln这个后缀名的文件,.sln也就是VS中创建的解决方案的后缀名。

  上图是我已经配置好的项目的样子,正常进入后,我们要进行一个操作:选中example,右键点击,设置为启动项目(要不然VS会不知道启动哪一个项目),然后编译运行项目。

5、运行结果

  由于我的课设需要利用学习索引实现范围查找,所以我修改了项目的main文件,实现了“出版时间”和“评论数量”的索引,利用范围查询筛选出出版时间在2000年至2020年、评论数量大于50000的书籍,并且按照评分排序,输出前十。以下是成功运行的结果:

总结

  好啦,本篇文章到这里就结束啦。主要是记录我从github上运行代码的过程,以后这个技能我应该会经常用到。最近喜欢上了通过博客记录自己近期所做的事情,希望通过这种方式记录下来自己成长的过程,加油!

  • 27
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值