千万级广告定向

在广告系统中,面对千万级别的广告定向,如何在短时间内过滤出符合条件的广告是一大挑战。文章介绍了从基础的遍历方法到采用倒排索引、bitmap以及Roaring Bitmap的数据结构优化过程,特别是Roaring Bitmap如何通过高效压缩和计算提高性能。通过这些技术,实现了在100毫秒内完成精准的广告过滤。
摘要由CSDN通过智能技术生成

在穿山甲,我们需要在很短(100ms级别)的时间里从千万级的广告中选择出(我们认为)最合适的广告,因此在每个环节都需要对性能进行充分的优化。这篇我们讲讲其中一个环节。


- 定向 -

广告系统的一个关键环节是定向(targeting)。

比如某个广告主可能只想把自己的广告投放给北京的男性用户,在创建广告时需要在广告平台上选择相应的定向条件:

巨量引擎创建广告计划[1]

当广告系统收到一个流量请求时,会根据流量的标签(包括但不限于地域、性别、年龄等),将不符合条件的广告过滤掉。


- 基础版 -

当在投广告的总数较少(几百~几千)时,最简单的做法是 O(n) 遍历一遍,实现简单。

以下是简单的示意代码:

def ad_targeting(request, ads):
  candidates = []
  for ad in ads:
    match = True
    for field, value in request.tags:
      if !ads.match(field, value):
        match = False
        break
    if match:
      candidates.append(ad)
  return candidates

注:本文代码只为表意,未经过测试(就是当伪代码看)。

但是如果广告数量达到万级以上的规模,O(n) 的实现的延迟就不太能让人接受了。


- 倒排索引 -

对于这种标签化的过滤,一个很简单的思路就是改成用倒排索引。

先根据广告的标签建立倒排:

field_names = ["city", "gender", "age"]


def build_inverted_index(ads):
  index = {} # field -> value -> array_of_ads
  for ad in ads:
    index["all"][NOT_SPECIFIED].add(ad)
    for field in field_names:
      value = ad.get_targeting_value(field)
      if value is None:
        index[field][NOT_SPECIFIED].a
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值