本工程是【复赛】比赛时选手需要下载的工程,选手实现工程内 TSDBEngineImpl 类。 评测程序会将选手提交的修改后的本工程代码进行编译并调用选手实现的 TSDBEngineImpl 类的接口进行测试。 其他参赛说明及本文档均未说明或不清楚的问题可询比赛客服。
- 日志必须使用 std::out 或 std::err,打印到其他地方正式测评时可能无法透传出来。
- 建议不要频繁打印日志,正式环境中日志的实现可能会产生同步、异步 IO 行为,影响选手成绩,正式比赛中对每次提交运行的总日志大小有限制。
- 选手只能修改 TSDBEngineImpl 类,选手可以增加其他类,但不能修改已定义的其他文件。
- 大赛官方不推荐通过链接使用三方库,如果需要使用三方库建议拷贝源码到工程中,如果需要链接使用请自行调试我们不提供支持。
- 自建的头文件请放入 include 文件夹,如果有子文件夹,引入时,请携带 include 为根的相对路径,因为正式编译时头文件路径只认 include 目录:
- 例如,头文件为 include/header_1.h,引入方式为 #include "header_1.h"
- 例如,头文件为 include/my_folder/header_2.h,引入方式为 #include "my_folder/header_2.h"
- 除了以 include 为根的相对路径,以本(cpp、c、cc)文件所在目录为相对路径引入头文件也是可以的
- 自建的 cpp 文件只能放入 source 目录下,可以存在子目录,因为正式编译时 cpp 搜寻目录只认 source 目录。
- 选手提交时,将本工程打包到一个 zip 包中,zip 包应将整个 lindorm-tsdb-contest-cpp 目录打包,而不是将该目录下的内容打包,即最终 zip 包根目录中只有 lindorm-tsdb-contest-cpp 一个目录:
- cd .xxxxx/lindorm-tsdb-contest-cpp
- cd .. # 退回上级目录
- add directory to zip package root: ./lindorm-tsdb-contest-cpp
- 实际评测程序不会依赖本工程下的 CMakeLists.txt,因此选手可以随意修改 cmake 的属性以满足本地调试需要。
- 基础代码选手不可修改的部分(如一些结构体等)我们已经事先进行了 UT 测试,但仍不排除存在 BUG 的可能性,如果选手发现了问题影响参赛,请及时与我们联系。
- 接口运行时抛出异常、返回值为异常返回值的,评测会立即结束,并视为运行失败。
- include:放置头文件的目录。
- source: 放置 cpp 文件的目录。
- 选手拉取本仓库,并实现 TSDBEngineImpl.cpp 中的各个接口函数。
- 选手打包,并上传。
- 评测程序将从 source 目录中扫描加载所有 cpp 文件。除 Linux 内置环境的 include 路径外,设置 include 根目录为头文件 -I 所在唯一位置(请选手注意对 include 子文件夹中头文件的引用路径)。
- 评测程序可能会执行的操作:
- 写入测试。
- 正确性测试。
- 重启,清空缓存。
- 重新通过先前的数据目录重启数据库,数据库需要加载之前持久化的数据。
- 正确性测试。
- 读取性能测试。
- 压缩率测试。
一个memtable中的所有列存在同一个文件当中
- Row的拷贝构造太多了,利用移动语义减少拷贝 DONE
- ColumnValue考虑自己重新实现一版 (不需要自己实现)
- 压缩算法的调研 (ZSTD)
- 异步写,io_uring, 协程(已经确定了线程模型)
- 固定字节的列的下刷与string分开,避免下刷条数被string限制,需要改造元数据管理(经过测试,没用)
- 性能测试编写需要提上日程(复赛再说)
- time range性能太差,需要对vid + ts块进行排序,块内二分查找(DONE)
- int和double压缩率太低,需要对其进行编码(这个是压缩率拉开差距的关键所在)
- block meta链表长度会达到20,影响time range的速度,将其改造为更高效一点的数据结构 (改造成AVL 区间查询tree完成)
int 45 string 6 double 9 一行456字节
35列最大值小于等于255 5列值特别小
有的列,数字分布不均衡
可以考虑:变长编码,霍夫曼编码,算数编码等来压缩int字段
复赛50000vin