主要知识点

  • precision_threshold参数的理解
  • HLL算法优化(hash)

 
 

 
 

cardinality,count(distinct),5%的错误率,性能在100ms左右

 
 

一、precision_threshold

优化准确率和内存开销

 
 

GET /tvs/sales/_search

{

"size" : 0,

"aggs" : {

"distinct_brand" : {

"cardinality" : {

"field" : "brand",

"precision_threshold" : 100

}

}

}

}

 
 

"precision_threshold":100 表示如果brand在100个之内,就是几乎保证100%准确。

cardinality算法,会占用precision_threshold * 8 byte 内存消耗,即是:

100 * 8 = 800个字节。precision_threshold的值设置的越大,占用内存越大,但可以确保更多unique value的场景下100%准确。官方统计,对于100万元的数据量,precision_threshold人值设为100的话,错误率不超过5%。所以要在精准度和内存占用中找到一个平衡点。

 
 

二、HyperLogLog++ (HLL)算法性能优化

 
 

cardinality底层算法用的是HLL算法。HLL算法会对所有的uniue value取hash值,通过hash值近似去求distcint count,误差较小,默认情况下,发送一个cardinality请求的时候,会动态地对所有的field value,然后再取这些field value 的 hash值; HLL算法优化的方法就是将取hash值的操作,前移到建立索引的时候,也就是在建立索引时就建立好hash这个索引,这样在搜索时就不用再建立hash,而是直接以hash值进行搜索。

 
 

在建立索引时就建立hash:

 
 

PUT /tvs2/

{

"mappings": {

"sales": {

"properties": {

"brand":{

"type": "text",

"fields": {"hash":{"type": "murmur3"}}}

}

}

}

}

 
 

进行搜索时:

GET /tvs/sales/_search

{

"size" : 0,

"aggs" : {

"distinct_brand" : {

"cardinality" : {

"field" : "brand.hash",

"precision_threshold" : 100

}

}

}

}

49.ardinality算法之优化内存开销以及HLL算法的更多相关文章

  1. R︱foreach+doParallel并行+联用迭代器优化内存+并行机器学习算法

    要学的东西太多,无笔记不能学~~ 欢迎关注公众号,一起分享学习笔记,记录每一颗"贝壳"~ --------------------------- 接着之前写的并行算法paralle ...

  2. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配

    特殊的工具和技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自己主动执行合适的构造函数来初始化每一个动态 ...

  3. JVM内存管理之GC算法精解(复制算法与标记/整理算法)

    本次LZ和各位分享GC最后两种算法,复制算法以及标记/整理算法.上一章在讲解标记/清除算法时已经提到过,这两种算法都是在此基础上演化而来的,究竟这两种算法优化了之前标记/清除算法的哪些问题呢? 复制算 ...

  4. JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)

    相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底理解标记/清除算法,不过倘若各位猿友不能在五分钟内 ...

  5. JVM内存模型与GC算法(简介)

    JVM内存模型如上图,需要声明一点,这是<Java虚拟机规范(Java SE 7版)>规定的内容,实际区域由各JVM自己实现,所以可能略有不同.以下对各区域进行简短说明. 1.1程序计数器 ...

  6. 一小部分机器学习算法小结: 优化算法、逻辑回归、支持向量机、决策树、集成算法、Word2Vec等

    优化算法 先导知识:泰勒公式 \[ f(x)=\sum_{n=0}^{\infty}\frac{f^{(n)}(x_0)}{n!}(x-x_0)^n \] 一阶泰勒展开: \[ f(x)\approx ...

  7. Android 性能优化 ---- 内存优化

    1.Android内存管理机制 1.1 Java内存分配模型 先上一张JVM将内存划分区域的图 程序计数器:存储当前线程执行目标方法执行到第几行. 栈内存:Java栈中存放的是一个个栈帧,每个栈帧对应 ...

  8. Android性能优化之巧用软引用与弱引用优化内存使用

    前言: 从事Android开发的同学都知道移动设备的内存使用是非常敏感的话题,今天我们来看下如何使用软引用与弱引用来优化内存使用.下面来理解几个概念. 1.StrongReference(强引用) 强 ...

  9. 算法的优化(C语言描述)

    算法的优化 算法的优化分为全局优化和局部优化两个层次.全局优化也称为结构优化,主要是从基本控制结构优化.算法.数据结构的选择上考虑:局部优化即为代码优化,包括使用尽量小的数据类型.优化表达式.优化赋值 ...

随机推荐

  1. mybatis Generator生成代码及使用方式(转载)

    转载自:http://www.cnblogs.com/fengzheng/p/5889312.html 文章很棒,很不错,转了.

  2. 双logo

    from aip import AipSpeech bd_k_l = ['11059852', '5Kk01GtG2fjCwpzEkwdn0mjw', 'bp6Wyx377Elq7RsCQZzTBgG ...

  3. 【转载】sql索引存储结构

    一.引言 对数据库索引的关注从未淡出我的们的讨论,那么数据库索引是什么样的?聚集索引与非聚集索引有什么不同?希望本文对各位同仁有一定的帮助.有不少存疑的地方,诚心希望各位不吝赐教指正,共同进步.[最近 ...

  4. Git文件不显示图标/标识

    初次使用Git服务功能,做了很多探路事情,记录下刚刚遇到的问题 情况:安装了Git应用程序,或者也安装了TortoiseGit-1.8.16.0-64bit(类似SVN工具)后,上传下载文件没有问题, ...

  5. vue实现全选,反选

    1.example.vue <template> <table class="table-common"> <tr> <th class= ...

  6. codevs1005生日礼物(dfs)

    1005 生日礼物  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold     题目描述 Description 9月12日是小松的朋友小寒的生日.小松知道小寒特别 ...

  7. codevs1258 关路灯(☆区间dp)

    1258 关路灯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master     题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须 ...

  8. [Swift通天遁地]四、网络和线程-(4)使用Alamofire实现网络请求

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  9. mysql索引的操作

    一.创建和查看普通索引 这是最基本的索引类型,而且它没有唯一性之类的限制 1.创建表时创建普通索引 CREATE TABLE table_name( 属性名 数据类型, ... 属性名 数据类型, I ...

  10. Zookeeper概念学习系列之zookeeper的节点

    znode有两种类型:  临时节点(ephemeral  node) 和 持久节点(persistent node). znode的类型在创建时确定并且之后不能再修改. 短暂znode的客户端会话结束 ...