热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

结合lucene谈谈整形值压缩上篇

2019独角兽企业重金招聘Python工程师标准本文主要结合开源lucene谈谈整形值的压缩问题,共分为基于内存的压缩和基于磁盘的压缩,此篇为基于

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

本文主要结合开源lucene谈谈整形值的压缩问题,共分为基于内存的压缩和基于磁盘的压缩,此篇为基于内存的压缩。

假如需将一堆正整数保存在一个集合中,并且能够任意的读写,一般最容易想到的方法是创建一个整形数组或者链表进行保存,但直接保存的缺点在于浪费空间,比如给定100个1-10之间的数只需100*4bit=400bit的空间(10最多需要4个bit),正常需要100*32bit=3200bit的空间,这正是lucene的实现方式。因此一般在压缩前需要算出这一串数字中最大值占用的bit位,然后通过时空的权衡选择合适的实现方法。因为不同的位数可能会跨数据块,如8位、16位、24位、32位、48位、64位可以通过现有的数据类型byte、short、int、long的组合进行表达;5位、11位等等就需要跨long或者int了,比如long可以存12个5bit的值,其余的4位必须和下一个long的1位进行合并这就是所谓的跨块,跨块后速度一定是有影响的,所以lucene给了跨块和不跨块的实现方式。如果不跨块就会浪费空间,这就是时空权衡。

Direct8、Direct16、Packed8ThreeBlocks、Direct32、Packed16ThreeBlocks、Direct64、Packed64这几个类是没有空间浪费的,实际上Packed64就满足实现需求了,底层基于long数组,通过计算设置数值的位置和一些位运算进行实现,但Direct8、Direct16、Packed8ThreeBlocks、Direct32、Packed16ThreeBlocks、Direct64可以直接用byte、short、int、long进行表示,它的位置计算量比Packed64来的高效。

Packed64SingleBlock与Packed64类似,但是它不跨块,是空间换时间的一种实现。支持的数据位是1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 16, 21, 32这几种,原因是用这些位数可以尽量减少浪费的空间。假设支持11位那么浪费9bit(64-5*11=9),13位浪费12bit(64-13*4=12),其余大家可以自己算一算,总之浪费的空间确实大了点。

GrowableWriter可在压缩的过程中动态计算值的最大bit位,并且动态扩充,它在某些场景下比如:数据集很大无法一下求出最大值占用的bit位,是很有用的。

PagedGrowableWriter在GrowableWriter基础上扩充了分段能力,即将数据集进行分段压缩比如1-16在段1,17-32在段2等等。同样对于GrowableWriter的使用场景,如果集合中有一个特大的值,那么所有的值都必须按照该值的bit位进行存储,很明显这也是浪费空间的。

PagedMutable与PagedGrowableWriter类似,提供了分段压缩,但是每段不会随着数值位数进行自动扩充,所以本质上跟Direct8、Direct16、Packed8ThreeBlocks、Direct32、Packed16ThreeBlocks、Direct64、Packed64和Packed64SingleBlock类似,只是分段后可以存储更多的值。

接下来说一说PackedLongValues,这个类提供随机读,但是不提供随机写,与PagedGrowableWriter很相似,在添加数值的时候内部会统计最大值所占的bit位,然后分段存储。

DeltaPackedLongValues是继承于PackedLongValues的,如果数值比较接近会将所有值减去最小值后然后再压缩,这样可以进一步减少占用空间。

MonotonicLongValues建立在DeltaPackedLongValues的基础上当给定序列是一个具有仿射函数序列时有较好的压缩效果,直接一点就是近似于一个线性函数序列时,首先通过求解函数的斜率将序列“放平”,得到一个平稳的序列之后,然后通过DeltaPackedLongValues方法进行二次压缩。

需要注意的是当数值bit位达到64的时候,可以存储负数了。

 

 

 

 


转:https://my.oschina.net/u/1268334/blog/2222454



推荐阅读
  • 本文介绍了P1651题目的描述和要求,以及计算能搭建的塔的最大高度的方法。通过动态规划和状压技术,将问题转化为求解差值的问题,并定义了相应的状态。最终得出了计算最大高度的解法。 ... [详细]
  • 无损压缩算法专题——LZSS算法实现
    本文介绍了基于无损压缩算法专题的LZSS算法实现。通过Python和C两种语言的代码实现了对任意文件的压缩和解压功能。详细介绍了LZSS算法的原理和实现过程,以及代码中的注释。 ... [详细]
  • Redis底层数据结构之压缩列表的介绍及实现原理
    本文介绍了Redis底层数据结构之压缩列表的概念、实现原理以及使用场景。压缩列表是Redis为了节约内存而开发的一种顺序数据结构,由特殊编码的连续内存块组成。文章详细解释了压缩列表的构成和各个属性的含义,以及如何通过指针来计算表尾节点的地址。压缩列表适用于列表键和哈希键中只包含少量小整数值和短字符串的情况。通过使用压缩列表,可以有效减少内存占用,提升Redis的性能。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了使用哈夫曼树实现文件压缩和解压的方法。首先对数据结构课程设计中的代码进行了分析,包括使用时间调用、常量定义和统计文件中各个字符时相关的结构体。然后讨论了哈夫曼树的实现原理和算法。最后介绍了文件压缩和解压的具体步骤,包括字符统计、构建哈夫曼树、生成编码表、编码和解码过程。通过实例演示了文件压缩和解压的效果。本文的内容对于理解哈夫曼树的实现原理和应用具有一定的参考价值。 ... [详细]
  • 合并列值-合并为一列问题需求:createtabletab(Aint,Bint,Cint)inserttabselect1,2,3unionallsel ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 本文介绍了在CentOS上安装Python2.7.2的详细步骤,包括下载、解压、编译和安装等操作。同时提供了一些注意事项,以及测试安装是否成功的方法。 ... [详细]
  • 配置IPv4静态路由实现企业网内不同网段用户互访
    本文介绍了通过配置IPv4静态路由实现企业网内不同网段用户互访的方法。首先需要配置接口的链路层协议参数和IP地址,使相邻节点网络层可达。然后按照静态路由组网图的操作步骤,配置静态路由。这样任意两台主机之间都能够互通。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 本文介绍了在Python中使用zlib模块进行字符串的压缩与解压缩的方法,并探讨了其在内存优化方面的应用。通过压缩存储URL等长字符串,可以大大降低内存消耗,虽然处理时间会增加,但是整体效果显著。同时,给出了参考链接,供进一步学习和应用。 ... [详细]
  • 本文由编程笔记#小编整理,主要介绍了关于数论相关的知识,包括数论的算法和百度百科的链接。文章还介绍了欧几里得算法、辗转相除法、gcd、lcm和扩展欧几里得算法的使用方法。此外,文章还提到了数论在求解不定方程、模线性方程和乘法逆元方面的应用。摘要长度:184字。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
author-avatar
思紅顏0114
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有