系列文章目录
学习型索引结构---开山之作学习 The Case for Learned Index Structures
学习索引--A Critical Analysis of Recursive Model Indexes(2021) (上)
学习型索引结构--ALEX: An Updatable Adaptive Learned Index
学习型索引----ALEX代码的一些记录
目录
前言
前段时间看了ALEX的论文,所以就趁热打铁,熟悉熟悉代码,没准做对比实验会用到。
一、配置
https://github.com/microsoft/ALEX
官网地址,是开源的。
二、步骤
1.下载
git clone https://github.com/microsoft/ALEX.git --recursive
2.测试程序
官方是windows和linux都可以,所以我为了方便,就是用的windows,没有使用VS,因为我感觉VS使用CMake是比较麻烦的,我用的是Clion.
打开就是我这个差不多界面,然后就是运行Cmake,它就会配置,这个运行之后它是会提示缺少文件,或者文件下载错误。
报错的主要是我圈出来的地方,你需要把网址输入到你的浏览器,然后把它下载下来,存放到应该存放的地方。这个学过Cmake的应该是看的懂的,就不多叙述了。
下完之后,重新构建以下,就完美通过了。先切换到example,运行一下。
可以看到,我们已经有结果出来了。到这里,就已经基本完成了。
三、三个可以编译和运行的程序
ALEX\src\examples\main.cpp
首先介绍的是ALEX 的示例程序,具体代码下载之后查看
这是一个简短的示例程序,演示了 ALEX(Adaptive Lexicographic Order Index)索引库的 API 使用方法。
ALEX 是一种学习索引结构,用于高效地存储和管理键值对数据。在这个示例程序中,演示了 ALEX 索引库的一些基本操作:
创建一些合成数据:生成一组键值对,其中键是介于 0 到 99 之间的稠密整数,值是随机数。
使用 ALEX 索引的 API 完成以下操作:
bulk_load
:批量加载数据,将 0 到 99 的键值对加载到索引中。insert
:插入数据,将 100 到 199 的键值对插入索引,使得索引中共有 200 个键值对。erase
:删除数据,删除键值在 0 到 9 范围内的数据,使得索引中共有 190 个键值对。- 迭代遍历索引中的数据,并根据键是否为偶数,更新其对应的值。
- 使用
lower_bound
和upper_bound
查找指定键的数据。- 使用
find
查找不存在的键,检查其是否存在于索引中。输出一些统计信息,包括最终的键值对数量和插入操作的数量。
该示例程序展示了如何使用 ALEX 索引库进行数据的插入、删除、查找和迭代等操作。在实际应用中,ALEX 索引可以用于更大规模的数据集,以提高索引和查询的性能。
运行结果
ALEX\src\benchmark\main.cpp
接下来我运行的是一个简单的基准测试,用于测量 ALEX 上运行点查找和插入的吞吐量。
按照github上面写的我输入参数。
./cmake-build-debug/benchmark --keys_file=resources/sample_keys.bin --keys_file_type=binary --init_num_keys=500 --total_num_keys=1000 --batch_size=1000 --insert_frac=0.5
运行得到结果(我是直接在clion的终端窗口中输入参数的)
benchmark\main.cpp 这段代码是一个简单的基准测试程序,用于在 ALEX(Approximate Locality-sensitive Hashing for Indexing) 数据结构上运行一系列点查找(lookups)和插入(inserts)操作,并测量它们的吞吐量(operations per second)。
程序首先解析命令行参数,包括文件路径、数据类型、初始键数量、总键数量、批处理大小等信息。然后从文件中读取键数据,并与随机生成的有效载荷(payload)组合。
接下来,程序创建 ALEX 索引,并使用 bulk_load
方法进行初始键的批量加载。接着,程序执行工作负载,即进行一系列的查找和插入操作。
工作负载包括以下步骤:
- 进行查找操作:随机选择一些键,并使用
get_payload
方法在 ALEX 索引中查找对应的有效载荷。如果找到了,则将有效载荷的值累加到sum
变量中,并计算查找操作的时间。 - 进行插入操作:随机选择一些键,并使用
insert
方法将它们插入到 ALEX 索引中。记录插入操作的时间。 - 检查工作负载结束条件:如果所有的键都被插入完毕,或者工作负载的执行时间超过了设定的时间限制,则终止工作负载。
程序在运行过程中输出了一些统计信息,包括每个批次的吞吐量和累计吞吐量。最后输出整个基准测试的累计统计结果,包括完成的批次数、总操作数、吞吐量等。
注意,该程序允许根据命令行参数修改数据类型。
ALEX\test\unittest_main.cpp
输出
总结
这是这个代码库提供的三个可运行程序的执行输出结果。记录一下。