Skip to content

Latest commit

 

History

History
122 lines (67 loc) · 4.55 KB

任务分析.md

File metadata and controls

122 lines (67 loc) · 4.55 KB

数据范围:

广告数据大小说明:

总文件大小 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向队友机器请求相同的返回(这里是否可以在接到请求的时候直接向两个队友机器发送请求,并在自己计算完优先队列之后等待返回在继续操作)

    • 将三个优先队列的内容合并为一个优先队列返回