项目的核心是搜索性能,基于此我们的设计思想主要涉及到以下四个关键点:压缩、排序、索引、并行。
- 压缩:根据数据特点,在读取数据的同时对数据进行压缩,尽量减小数据的大小。
- 排序:针对关键属性进行排序,作为后续工作高效的基础。
- 索引:设计新的数据结构,并针对所设计的数据结构建立索引,提升查询效率。
- 并行:对算法进行并行化,充分且合理地使用计算资源和发挥GPU并行计算的优势。
针对以上的几个关键点,列举主要的优化措施如下:
- 部门名称压缩:考虑到编码压缩在当前问题下并不具有令人满意的效果,我们针对数据特点自己设计了压缩算法。
- 桶排序:保障常用的时间条件查询的高效。
- 堆排序:我们使用最小堆排序实现降序TOPK查询,避免对不满足查询条件的数据在维护堆时所花费的不必要的时间 。
- 并行化:在使用CPU和GPU时使用多线程,对算法中的某些部分进行并行化,例如通过thrust库的copyif函数快速定位每个数据开始的位置,然后利用cuda开多线程同时处理数据;通过cuda的流,并发地处理数据。
- 冷热数据分离:避免查询热数据的过程中,对所关联的冷数据产生不必要的操作,消耗计算资源。
在设计的过程中,我们遵循奥卡姆剃刀原则,在没有必要的情况下,尽量用简单方法解决问题。
- 将测试数据放到指定的位置。
- 如果没有编译程序,先将程序进行编译,编译完成的程序放到和run.sh相同的文件下,详细编译方式见下“编译方式”部分。
- 在控制台运行run.sh,参数设置同初赛要求相同,具体见下“运行方法”部分。
- 在控制台获得查询结果。
$ sh Compile.sh
在控制台运行run.sh,具体命令格式如下:
选手需要提前将3个数据文件放到run.sh 相同目录,提交的程序将会以如下格式的命令运行、进行评测。
$ sh run.sh customer.txt orders.txt lineitem.txt n n*4个参数
第四个参数表示总共计算的次数 第5-8个参数为第一次计算时的4个参数 第9-12个参数为第二次计算时的4个参数 … 第1+4n~4+4n 个参数为第n次计算时的4个参数 四个参数分别对应以下的条件值:
c_mktsegment = ?
o_orderdate < ?
l_shipdate > ?
LIMIT ?
$ sh run.sh