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上运行代码的过程,以后这个技能我应该会经常用到。最近喜欢上了通过博客记录自己近期所做的事情,希望通过这种方式记录下来自己成长的过程,加油!