广告数据大小说明:
总文件大小 69G
关键词的数量keywrod(uint64): ~100万
广告单元的数量adgroup_id(uint64) : ~500万
广告计划的数据campaign_id:~100万
广告单元上的关键词数量keywrod(uint64): ~100
服务可运行在最多3个16G内存16cpu的容器中
keywrod(uint64) | adgroup_id(uint64) | price(uint64) | status(int8) |
---|---|---|---|
2916200016 | 644960096148 | 63885 | 1 |
timings(int8, 0/1列表,长度24) | vector(float列表) | campaign_id(uint64) | item_id(uint64) |
---|---|---|---|
0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,1,0,1,1,0,1,0,0 | 0.993916,1 | 217245901050 | 646829064714 |
keywrod(uint64) | vector(float列表) | hour | topn |
---|---|---|---|
2916200016 | 0.351177,0.936309 | 7 | 2 |
topn个response:
adgroup_id(uint64) | prices |
---|---|
644960096148,1710671559561 | 27435,39778 |
核心是广告单元 我们返回的是广告单元的id
如果一开始的理解没有错误的话 ,一开始的时间是固定的,并且每过一段时间hour字段才会变
-
第一步要处理的就是按照时间对data进行切片
-
涉及到csv的分块读写
-
把/data/raw_data.csv中的文件按照时间切片切成/data/time1-24.csv
-
存储格式为:
-
keywrod(关键词) adgroup_id(广告单元id) price(出价列表) vector(商品向量) 2916200016 644960096148 63885 0.993916,1 -
注:这里item_id也不知道他存在的意义是啥,他和推广单元是1对1的
-
这里就要先构建好keyword的map id对vector下标索引
-
-
处理为预先加载当前的时间节点请求(问题是怎么知道一开始所需求的时间节点是多少呢)
- 经过上述处理体感单个时间节点的数据量级直接缩小一个数量级即7G左右(存疑惑,这样单机不就跑通了吗)
- 那么单机可以容纳两个时间点的需求数量
- 处理方法跟初赛的版本切换方法类似 绑定k个核心用来做版本切换(调参行为,一开始可以直接设置一半吧)
- 分机器的方法应该也还行,一开始在预处理的时候存个数组 表示每个时间段的数据量 然后直接3分
-
内存中的存储方式
- 构建三个二维的vector用来存储 第一维为keyword关键词的map id 第二维分别为adgroup_id 、price、vector的列表
-
后续为处理用户发送的请求
-
首先选择keyword的列表
-
keywrod(uint64) vector(float列表) hour topn 2916200016 0.351177,0.936309 7 2 -
然后计算每一项的得分
-
计算方式:
-
排序分数 = 预估点击率 x 出价(分数越高,排序越靠前)
-
预估点击率 = 商品向量 和 用户_关键词向量 的余弦距离
-
计费价格 = 第 i+1 名的排序分数 / 第 i 名的预估点击率(i表示排序名次,例如i=1代表排名第1的广告)
-
ctr = cos(vec(data[i]), vec(user))
-
score = ctr * prices[i]
-
price = score/ctr
-
-
计算和排序注意事项:
- 排序过程遇到adgroup_id重复,则优先选择排序分数高者,如若同时排序分数相等则取出价低者;若排序过程中排序分数相同,选择出价低者,
- 出价相同,adgroup_id大的排前面。
- 浮点运算相关:请计算过程中全部使用float32
- 点击率预估分计算原始结果加上0.000001f,确保非0
- 出价结果(uint64),涉及浮点运算,请按照四舍五入取整
- 若召回的广告集合少于等于请求的topn时,最后一名的计费价格使用其自身的出价
-
构建一个topn的优先队列存储需要的结果响应优先级(排序分数 出价 adgroup_id)
-
对于请求的响应容器 用TLV向队友机器请求相同的返回(这里是否可以在接到请求的时候直接向两个队友机器发送请求,并在自己计算完优先队列之后等待返回在继续操作)
-
将三个优先队列的内容合并为一个优先队列返回
-