SuRF(Succinct Range Filter)是一种快速而紧凑的过滤器,同时支持点查询和范围查询(包括开区间查询、闭区间查询、范围计数),可以在RocksDB中用SuRF来替换Bloom过滤器。

FAST SUCCINCT TRIES

SuRF是基于FST(Fast Succinct Tries)的,这是一种同时支持点查询和范围查询,且具有高效的空间利用率的静态字典树。FST的设计是基于如下观察结果:字典树的上层包含了相对较少的节点,但却发生了相对较多的访问,而字典树的下层包含了相对较多的节点,但发生的访问较少。因此FST包含了LOUDS-Dense和LOUDS-Sparse两个部分,LOUDS-Dense优先考虑性能而不是空间占用,LOUDS-Sparse高效地利用空间从而限制了FST的总体空间占用。

下图(引用自论文)是一个FST的例子:

LOUDS-Dense

LOUDS-Dense中的每个节点包含了3个256位的bitmap和一个字节序列,他们的含义如下:

  1. D-Labels:标记该节点的分支表示的字符。如果一个节点的分支表示的字符在bitmap中的相应位是1,该位的下标为这个字符的ASCII码值。$是一个特殊字符,表示到该节点某个分支位置的前缀也是一个合法的key。
  2. D-HasChild:标记该节点的每个分支是否还有子节点。
  3. D-IsPrefixKey:标记到该节点某个分支为止的前缀是否也是一个合法的key。
  4. D-Values:是按序排列的一些与每个key对应的定长的值。

两个公式:

  1. D-ChildNodePos(pos) = 256 ×rank1(D-HasChild, pos):计算第一个子节点的位置。
  2. ParentNodePos(pos) = 256 ×select1 (D-HasChild, ⌊pos/256⌋) :计算父节点的位置。

LOUDS-Sparse

LOUDS-Dense中的每个节点包含了2个字节序列和2个bitmap,他们的含义如下:

  1. S-Labels:标记该节点的分支表示的字符。
  2. S-HasChild:标记该节点的每个分支是否还有子节点。
  3. S-LOUDS:标记该节点的每个分支是否是该节点的第一个分支。
  4. S-Values:和D-Values一样。

三个公式:

  1. S-ChildNodePos(pos) = select1(S-LOUDS, rank1(S-HasChild, pos) + 1)
  2. S-ParentNodePos(pos) = select1(S-HasChild, rank1(S-LOUDS, pos) - 1)
  3. S-ValuePos(pos) = pos - rank1(S-HasChild, pos) - 1

FST的优化

FST中最典型的操作就是rank、select和label search,FST对这三个都做了优化。

下图(引用自论文)是FST优化的一个例子:

  1. rank优化:对于一个bit-vector,每B位作为一个block,每个block在LUT中分配32位的空间来存储这个block起始位置的rank值。LOUD-Dense的B是64,这就保证了popcount指令在每次rank计算时只需要调用一次,LOUD-Sparse的B是512,适应于cacheline的大小,而且可以节省空间。
  2. select优化:对于每一个采样查询,在LUT中分配32位的空间来存储这次采样查询得到的select的值。

SUCCINCT RANGE FILTERS

为了平衡FPR和空间占用,基于FST的SuRF采用了删减的字典树,并有四种模式:

  1. SuRF-Base:对于用于构建SuRF的key,只截取在所有key中能唯一区分这个key的最短的前缀。这种模式的空间占用最小,但是FPR最高。
  2. SuRF-Hash:在SuRF-Base的基础上,对于每个key,在叶节点的Values里存储这个key的哈希值的后n位,当搜索到叶节点后,还需要比较这个哈希值的后n位。这种模式能极大的减小点查询的FPR,但是并不会减小范围查询的FPR,因为key的哈希值无法用于比较key的顺序。
  3. SuRF-Real:在SuRF-Base的基础上,对于每个key,存储这个key用于构建SuRF的前缀之后的n位,当搜索到叶节点后,还需要比较这n位。这种模式可以同时提升点查询和范围查询的FPR,但是提升的效果不如SuRF-Hash。
  4. SuRF-Mixed:SuRF-Hash和SuRF-Real的结合。

382 Love u

SuRF: Practical Range Query Filtering with Fast Succinct Tries 阅读笔记的更多相关文章

  1. SuRF : Practical Range Query Filtering with Fast Succinct Tries

    1. Introduction 在数据库管理系统中查找某些关键字会导致很大的磁盘I/O开销,针对这一问题,通常会使用一个内存开销小并且常驻内存的过滤器来检测该关键字是否存.比如现在常用的bloom过滤 ...

  2. Fast R-CNN论文阅读笔记

    论文地址:Fast R-CNN R-CNN的缺陷 (1)训练是一个多级的流水线.R-CNN首先在候选目标上微调一个卷积神经网络,使用log loss.然后使用SVMs充当目标分类器,以取代softma ...

  3. elasticsearch term 查询二:Range Query

    Range Query 将文档与具有一定范围内字词的字段进行匹配. Lucene查询的类型取决于字段类型,对于字符串字段,TermRangeQuery,对于数字/日期字段,查询是NumericRang ...

  4. [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximati

    [论文阅读笔记] Fast Network Embedding Enhancement via High Order Proximity Approximation 本文结构 解决问题 主要贡献 主要 ...

  5. 【题解】【数组】【Prefix Sums】【Codility】Genomic Range Query

    A non-empty zero-indexed string S is given. String S consists of N characters from the set of upper- ...

  6. How to write date range query in Nest ElasticSearch client?

    Looking at the source code, there are two overloads of the OnField method. When I use the the that t ...

  7. SCU 4443 Range Query

    二分图最大匹配,枚举. 可以计算出每一个位置可以放哪些数字,每个数字可以放在哪些位置,这样就可以建二分图了. 如果二分图最大匹配不到$n$,则无解.否则构造字典序最小的解,可以枚举每一位放什么数字,然 ...

  8. 第十五届四川省省赛 SCU - 4443 Range Query

    先给你1~N的N个数 再给你每种最多50个的条件(ai,bi,ci) 或者[ai,bi,ci] (ai,bi,ci)表示下标ai到bi的最小值必为ci [ai,bi,ci]表示下标ai到bi的最大值必 ...

  9. Fast R-CNN论文阅读摘要

    论文链接: https://arxiv.org/pdf/1504.08083.pdf 代码下载: https://github.com/rbgirshick/fast-rcnn Abstract Co ...

随机推荐

  1. 我发起了一个 用 javascript 写一个 Office 的 开源项目 JS Office

    用   js  写   Office,  说实在的,  把 现在已有的 各种 富文本编辑器 和 电子表格 js 库 收集起来 整合一下 就 差不多了 , 放到 前几天 那个 “  js 作为 一等公民 ...

  2. shell生成随机字符串

    #!/bin/bash i=1while [ $i -le 10000 ]doa=`echo `< /dev/urandom tr -dc A-Za-z0-9 | head -c6``echo  ...

  3. MySQL高可用工具--orchestrator

    orchestrator是一款MySQL高可用工具,其支持: 集群拓扑探测 集群拓扑重塑 故障恢复 提供3种使用方式: 命令行 HTTP API web页面 orchestator github地址

  4. springboot Cacheable(redis),解决key乱码问题

    import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.Redis ...

  5. JSP和Struts2、Hibernate、Spring3基础内容和原理

    一.JSP工作原理 1.首先是利用客户端浏览器,然后由客户端浏览器请求JSP页面,向JSP服务器发出请求. 2.JSP服务器内部原理 JSP服务器首先在收到客户端传送过来的请求后,将JSP页面编译成S ...

  6. 使用 AWK 去掉文本文档中的空白行

    在 Linux 操作系统中,可以使用 AWK 命令高效地处理文本文档.AWK 命令通过执行使用 AWK 语言编写的脚本程序,处理文本文档.AWK 脚本程序是由模式(patterns)与相关操作(cor ...

  7. 7.6.2 break 语句

    7.6.2 break 语句 程序执行到循环中的break语句时,会种植包含它的循环,并继续执行下一阶段. 如果break语句位于嵌套循环内,它只会影响包含它的当前循环. break还可用于因其他原因 ...

  8. 一台机器部署多个tomcat服务 nginx反向代理多个服务 笔记

    安装tomcat步骤           1. 下载apache-tomcat-8.0.30 ,下载下来的文件为apache-tomcat-8.0.30-windows-x64.zip         ...

  9. centos7 安装远程桌面

    https://www.linuxidc.com/Linux/2017-09/147050.htm https://blog.csdn.net/dazhi_1314/article/details/7 ...

  10. Java中的transient关键字

    转载于:[lfsf802](http://blog.csdn.net/lfsf802/article/details/43239663) 关键字介绍 一个对象只要实现了Serilizable接口,这个 ...