31.3 XOR压缩和相关的prometheus源码解读

本节重点介绍 :

  • xor 压缩value原理
  • xor压缩过程讲解
  • xor压缩prometheus源码解读
  • xor 压缩效果

xor 压缩value原理

  • 原理:时序数据库相邻点变化不大,采用异或压缩float64的前缀和后缀0个数

xor压缩过程讲解

gorilla_04.jpg

gorilla_05.jpg

  • 第一个值使用原始点存储
  • 计算和前面的值的xor
    • 如果XOR值为0,即两个Value相同,那么存为’0’,只占用一个bit。
    • 如果XOR为非0,首先计算XOR中位于前端的和后端的0的个数,即Leading Zeros与Trailing Zeros。
      • 第一个bit值存为’1’。
      • 如果Leading Zeros与Trailing Zeros与前一个XOR值相同,则第2个bit值存为’0’,而后,紧跟着去掉Leading Zeros与Trailing Zeros以后的有效XOR值部分。
      • 如果Leading Zeros与Trailing Zeros与前一个XOR值不同,则第2个bit值存为’1’,而后,紧跟着5个bits用来描述Leading Zeros的值,再用6个bits来描述有效XOR值的长度,最后再存储有效XOR值部分(这种情形下,至少产生了13个bits的冗余信息)

xor压缩prometheus源码解读

  • xorAppender.Append 中调用的writeVDelta ,位置 D:\go_path\src\github.com\prometheus\prometheus\tsdb\chunkenc\xor.go
  • vDelta代表xor的结果值,然后进行判断
func (a *xorAppender) writeVDelta(v float64) {vDelta := math.Float64bits(v) ^ math.Float64bits(a.v)if vDelta == 0 {a.b.writeBit(zero)return}a.b.writeBit(one)leading := uint8(bits.LeadingZeros64(vDelta))trailing := uint8(bits.TrailingZeros64(vDelta))// Clamp number of leading zeros to avoid overflow when encoding.if leading >= 32 {leading = 31}if a.leading != 0xff && leading >= a.leading && trailing >= a.trailing {a.b.writeBit(zero)a.b.writeBits(vDelta>>a.trailing, 64-int(a.leading)-int(a.trailing))} else {a.leading, a.trailing = leading, trailinga.b.writeBit(one)a.b.writeBits(uint64(leading), 5)// Note that if leading == trailing == 0, then sigbits == 64.  But that value doesn't actually fit into the 6 bits we have.// Luckily, we never need to encode 0 significant bits, since that would put us in the other case (vdelta == 0).// So instead we write out a 0 and adjust it back to 64 on unpacking.sigbits := 64 - leading - trailinga.b.writeBits(uint64(sigbits), 6)a.b.writeBits(vDelta>>trailing, int(sigbits))}
}

xor 压缩效果

xor.png

  • 从结果来看:
  • 只占用1个bit的Value比例高达59.06%,这说明约一半以上的Point Value较之上一个Value并未发生变化。
  • 30%比例的Value平均占用26.6 bits,即上面的情形2.1。
  • 余下的12.64%的Value平均占用39.6 bits,即上面的情形2.2。
  • 我认为xor压缩效果取决于series曲线波动情况,越剧烈压缩效果越差,越平滑压缩效果越好

本节重点总结 :

  • xor 压缩value原理
  • xor压缩过程讲解
  • xor压缩prometheus源码解读
  • xor 压缩效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60046.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解决 IDEA 修改代码重启不生效的问题

前言 在使用 IntelliJ IDEA 进行 Java 项目开发时,有时会遇到一个令人头疼的问题:修改了代码后,重启服务却发现更改没有生效。通常情况下,解决这个问题需要通过 Maven 的 clean 和 compile 命令来强制重新编译,但这显…

java 根据 pdf 模板带图片文字生成pdf文件

在现代应用开发中,自动生成包含动态内容的 PDF 文档在电子发票、合同生成、表单填充等场景中有着广泛的应用。本文将介绍如何使用 iText 库动态填充 PDF 模板字段,并在指定位置插入签名和公章图片。 项目需求 假设我们有一个 PDF 模板文件,包含表单字段,如用户姓名、地址…

MTK主板定制_联发科主板_MTK8766/MTK8768/MTK8788安卓主板方案

主流市场上的MTK主板通常采用联发科的多种芯片平台,如MT8766、MT6765、MT6762、MT8768和MT8788等。这些芯片基于64位Cortex-A73/A53架构,提供四核或八核配置,主频可达2.1GHz,赋予设备卓越的计算与处理能力。芯片采用12纳米制程工艺…

Windows仿macOS?看这一篇就够了

如果你有任何关于Windows仿macOS的问题,可加入942644281 (QQ群) Date9.20更新:增加功能按键左移部分Date9.16更新:增加了大多数资源的网盘链接Date9.15更新:增加StartAllBack,资源管理器调整部…

OSRM docker环境启动

命令一把梭 wget https://download.geofabrik.de/asia/china-latest.osm.pbf docker pull osrm/osrm-backend docker run -t -v "${PWD}:/data" osrm/osrm-backend osrm-extract -p /opt/car.lua /data/china-latest.osm.pbf docker run -t -v "${PWD}:/data&q…

如何用python将pdf转换为json格式

使用 Python 将 PDF 文件转换为 JSON 格式,主要步骤如下: 读取 PDF 内容:首先使用一个库读取 PDF 文件内容,如 PyMuPDF 或 pdfplumber。这些库可以逐页提取文本,并返回结构化的数据。 组织数据到 JSON:将提…

内存、显存和GPU在Transformer架构中承担什么计算任务

目录 内存、显存和GPU在Transformer架构中承担什么计算任务 一、内存、显存和GPU的区别 二、在Transformer架构中的计算任务 内存、显存和GPU在Transformer架构中承担什么计算任务 是计算机系统中重要的组成部分,它们在Transformer架构中承担着不同的计算任务。以下是对这…

无法下载element-admin的依赖无法运行

目录 无法下载element-admin的依赖偷懒方法完美方法 运行element-admin错误 之前在下载element-admin时遇到了多多少少的问题 无法下载element-admin的依赖 偷懒方法 开始是从github下载源码后安装依赖时在与tui-editor相关的依赖时就会卡死,然后报错&#xff0c…

React中 修改 html字符串 中某些元素的属性

在React中,你可以使html-react-parser库来解析HTML字符串,并修改其中的img标签的width属性后,再使用React的ReactDOMServer.renderToStaticMarkup方法将React元素转换为HTML字符串。 import htmlReactParser from html-react-parser; import…

基于Java Springboot幼儿园管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 🚀 更简单 👌 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/

力扣513:找树左下角的值

给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 层层遍历代码: /*** Definition for a binar…

vue2 面试题带答案,万字总结

1. 什么是 vue Vue 是一套用于构建用户界面的渐进式框架。Vue.js 的主要特点:渐进式框架、声明式渲染、组件化、响应式数据绑定等; 2、MVC 和 MVVM 区别 MVC 是模型(model)-视图(view)-控制器(controller),控制器负责…

Python | Leetcode Python题解之第564题寻找最近的回文数

题目: 题解: class Solution:def nearestPalindromic(self, n: str) -> str:m len(n)candidates [10 ** (m - 1) - 1, 10 ** m 1]selfPrefix int(n[:(m 1) // 2])for x in range(selfPrefix - 1, selfPrefix 2):y x if m % 2 0 else x // 10…

爬虫——数据解析与提取

第二节:数据解析与提取 在网络爬虫开发中,获取网页内容(HTML)是第一步,但从这些内容中提取有用的数据,才是爬虫的核心部分。HTML文档通常结构复杂且充满冗余信息,因此我们需要使用高效的解析工…

java 泛型中的 ?

在 Java 泛型中,? 被称为通配符(wildcard),它代表了未知的类型。使用通配符可以增加代码的灵活性,允许在不知道具体类型的情况下操作泛型类或接口。通配符主要有以下几种形式: 无界通配符(Unbo…

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan

使用 Ant Design Vue 自定渲染函数customRender实现单元格合并功能rowSpan 背景 在使用Ant Design Vue 开发数据表格时,我们常常会遇到需要合并单元格的需求。 比如,某些字段的值可能会在多行中重复出现,而我们希望将这些重复的单元格合并为…

RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)

文章目录 RabbitMQ教程:发布/订阅模式(Publish/Subscribe)(三)一、引言二、简介三、准备工作3.1 说明3.2 生成项目 四、实战4.1 交换机(Exchanges)4.2 临时队列(Temporary Queues&am…

html兼容性问题处理

文章目录 HTML5兼容性问题及解决方法1. 标签支持问题2. 兼容性检测3. 属性值支持问题4. 媒体支持问题5. Web API支持问题6. CSS兼容性问题7. 特定浏览器问题的解决方法 HTML5兼容性问题及解决方法 HTML5作为一种新的标记语言,虽然带来了许多新特性和改进&#xff0…

CANoe发送和接收CAN DataBase(DBC文件)数据

目录 1、接收CAN数据,DBC解析数据内容 2、发送DBC定义的CAN报文 CANoe是一款强大的网络仿真和开发工具,它支持发送和接收基于CAN DataBase(DBC文件)的数据。 1、接收CAN数据,DBC解析数据内容 要使用CANoe接收CAN数…