工具癖程序员

技术总结 - Key/Value存储比赛总结

2016-09-18  本文已影响0人  yche

背景


赛码会是由千里码主办,网银互联赞助的面向国内程序员的工程竞赛。比赛选用题目脱胎于业界经典工程问题,旨在考察参赛者的综合工程实力。我在此次比赛中排名第8,在这里分享一下我的思路和代码。

题目简介


测试数据介绍


测试数据 Key Value put数 get数 CPU限制 硬盘限制 内存限制
small-1 10~70 char 80~160 char 50,000 50,000 1核 1G 100MB
small-2 10~70 char 80~160 char 10,000 90,000 1核 1G 100MB
small-3 10~70 char 80~160 char 90,000 10,000 1核 1G 100MB
medium-1 10~300 char 1k~3k char 500,000 500,000 1核 10G 300MB
medium-2 10~300 char 1k~3k char 900,000 100,000 1核 10G 300MB
medium-3 10~300 char 1k~3k char 100,000 900,000 1核 10G 300MB
large-1 1k~3k char 10k~30k char 50,000 50,000 1核 10G 300MB
large-2 1k~3k char 10k~30k char 90,000 10,000 1核 10G 300MB
large-3 1k~3k char 10k~30k char 10,000 90,000 1核 10G 300MB

比赛评判标准介绍


针对小数据思路


针对小数据的评测结果


评测结果中QPS和TPS为比赛中的积分,小数据测试集合的QPS/TPS结果分别为145w和80w。详细数据如下表所示:

Memory Time Disk Read Disk Write QPS/TPS Init Time
23932KB 182ms 6389KB 1448KB 1445040/802228 46ms

针对小数据的C++代码


针对小数据的代码主要利用了mmap, memcpy和自己写的yche_map来达到全内存缓存快速KV存取和数据正确落盘的效果。详细代码请见针对小数据代码Github链接地址

针对三种数据通用解法思路


"file-layout"

通用解法的评测结果


评测结果中QPS和TPS为比赛中的积分,下面的结果分别为:小数据120w+17w,中等数据16.5w+8.5w,大数据4.5w+1.5w。详细数据如下表所示。

Dataset Memory Time Disk Read Disk Write QPS/TPS Init Time
Small 18760KB 477ms 568081KB 7312KB 1217694/175900 174ms
Medium 214708KB 19878ms 2534644KB 1454295KB 165418/88738 1204ms
Large 285676KB 16934ms 3056752KB 2745263KB 46409/15153 1039ms

通用解法的C++代码


通用解法主要使用了ifstream, ofstream来进行数据落盘,利用了yche_map建立所有key和value_info的map,并且应用了value的内存缓存策略来加速查询。详细代码请见针对三种数据通用解法代码Github链接地址

上一篇 下一篇

猜你喜欢

热点阅读