有关LZF算法的相关解析文档比较少,但是Apple对LZF的开源,可以让我们对该算法进行一个简单的解析。LZFSE 基于 Lempel-Ziv ,并使用了有限状态熵编码。 LZF采用类似lz77和lzss的混合编码。使用3种“起始标记”来代表每段输出的数据串。 接下来看一下开源的LZF算法的实现源码。 } while (iidx < inputLength); return (int)oidx; } 以上是LZF
LZF 扩展直接在 phar.php.net 下载安装即可,也是走得正常的 PHP 的扩展安装的步骤。LZF 压缩算法基于 Lempel-Ziv ,并使用了有限状态熵编码。 echo lzf_optimized_for(), PHP_EOL; // 1 // 如果LZF针对速度进行了优化,则返回1;对于压缩,则返回0。 LZF 全部就只提供了这三个非常简单的函数。 lzf_compress() 用于对字符串进行压缩编码,可以看出我们输出的压缩之后的内容已经变成了乱码的形式。但是相对于 Bzip2 完全看不懂的编码内容来说,LZF 是可以看到原文的一部分内容的。 lzf_decompress() 用于解码已经编码的字符串内容。 lzf_optimized_for() 输出的是 LZF 扩展的编译后运行状态,如果返回的是 1 ,则表明针对当前系统的速度进行了优化,如果返回的是 0 ,表示的是仅仅是进行了压缩编码。
/python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf -I/usr/include/python3.6m -c lzf_module.c -o build/temp.linux-x86_64-3.6/lzf_module.o -Wall gcc: /python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf -I/usr/include/python3.6m -c lzf_module.c -o build/temp.linux-x86_64-3.6/lzf_module.o -Wall lzf_module.c /python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf
这里扩展一下如何解析redis的rdb文件 点击查看 PS C:\Users\Administrator\Desktop\fsdownload> pip install rdbtools python-lzf Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple Collecting python-lzf Downloading https python\python37\lib\site-packages (from rdbtools) (3.3.2) Using legacy 'setup.py install' for python-lzf Installing collected packages: rdbtools, python-lzf Running setup.py install for rdbtools ... done Running setup.py install for python-lzf ... done Successfully installed python-lzf-0.2.4 rdbtools
总时间限制: 1000ms 内存限制: 256000kB描述 众所周知,LZF很喜欢打一个叫Jubeat的游戏。 LZF觉得这太简单了,于是自己仿了个游戏叫Jubeeeeeat,唯一不同之处就是界面大小,Jubeeeeeat的界面为n×n的方阵。 在某一刻,界面同时出现了若干个combo。 LZF终于觉得有些困难了,但毕竟LZF不是普通人,他有很多只手。LZF的手分为m只“肉质手”和q只“意念手”。 顾名思义,“肉质手”是实际存在的手,每只肉质手都有5根手指,每根手指能按一个combo,但每只手的速度都不同,受限于此,LZF的每只肉质手的控制范围是一个固定大小的正方形。 现在LZF想知道,他最多能按下多少个combo。 输入输入文件名为 jubeeeeeat.in。 第1行输入三个正整数n,m,q。
To install, run the following command: pip install python-lzf ? 从报错信息看,是由于缺少python-lzf包,根据提示直接使用pip install python-lzf命令进行安装 解决方法: # 在安装python-lzf之前,要安装python-devel依赖包 centos yum.repos.d]# yum install python-devel [root@VM_54_118_centos yum.repos.d]# pip install python-lzf /packages/e3/33/b8f67bbe695ccc39f868ae55378993a7bde1357a0567803a80467c8ce1a4/python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf ... done Successfully
/python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf -I/usr/include/python3.6m -c lzf_module.c -o build/temp.linux-x86_64-3.6/lzf_module.o -Wall gcc: /python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf -I/usr/include/python3.6m -c lzf_module.c -o build/temp.linux-x86_64-3.6/lzf_module.o -Wall lzf_module.c /python-lzf-0.2.4.tar.gz Installing collected packages: python-lzf Running setup.py install for python-lzf
采用无损压缩算法:LZF算法。 /* quicklistLZF is a 4+N byte struct holding 'sz' followed by 'compressed'. * 'compressed' is LZF data with total (compressed) length 'sz' * NOTE: uncompressed length is stored compressed, node->zl points to a quicklistLZF */ typedef struct quicklistLZF { unsigned int sz; /* LZF * encoding: 2 bits, RAW=1, LZF=2. * container: 2 bits, NONE=1, ZIPLIST=2. 位于lzf_c.c 和 lzf_d.c,有兴趣的朋友可以自己去看。 讲真,我看不懂。
对象,请参考 Bitmap types 来了解更多 N(默认=Roaring) dimensionCompression String 针对维度(dimension)列使用的压缩算法,请从 LZ4, LZF N(默认= LZ4) metricCompression String 针对主要类型 metric 列使用的压缩算法,请从 LZ4, LZF,或者 uncompressed 中选择。
实际上我们只要自己实现一种较通用的数据压缩方法就可以做到了,并且之前已经有人这么去做了,相关的讨论可以看这里,其中提及的源码可以直接使用(实现了LZF算法),代码不长,我简单调整了一下,如下所示:
/* version
* of this file under either the BSD or the GPL.
*/
using System;
///
2、CountDownLatch 实现 2.1 模拟班主任等学生 package lzf.juc; import java.util.Random; import java.util.concurrent.CountDownLatch 代码实现 package lzf.juc; import java.util.Random; import java.util.concurrent.CountDownLatch; import java.util.concurrent.TimeUnit package lzf.juc; import java.util.Random; import java.util.concurrent.CountDownLatch; /** * @author int bnum = new Random().nextInt(5) ; int cnum = new Random().nextInt(5) ; 完整代码 package lzf.juc; import
* encoding: 2 bits, RAW=1, LZF=2. * container: 2 bits, NONE=1, ZIPLIST=2. count : 16; /* 当前ziplist中存储了多少个元素,占16bit(下同),最大65536个 */ unsigned int encoding : 2; /* 是否采用了LZF 压缩算法压缩节点,1:RAW2:LZF */ unsigned int container : 2; /* 2:ziplist,未来可能支持其他结构存储 */ unsigned int
unsigned int count : 16;//ziplist中存储的元素个数,16字节(最大65535个) unsigned int encoding : 2; //是否采用了LZF 压缩算法压缩节点 1:RAW 2:LZF unsigned int container : 2; //存储结构,NONE=1, ZIPLIST=2 unsigned int recompress 为了加快速度,Redis竟做了这么“疯狂”的设计 quicklist 的 compress 属性 compress 是用来表示压缩深度,ziplist 除了内存空间是连续之外,还可以采用特定的 LZF quicklistNode 的 zl 指针 zl 指针默认指向了 ziplist,上面提到 quicklistNode 中有一个 sz 属性记录了当前 ziplist 占用的字节,不过这仅仅限于当前节点没有被压缩(通过LZF quicklistLZF 是一个 4+N 字节的结构: typedef struct quicklistLZF { unsigned int sz;// LZF大小,占用4字节 char
指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大 rdbcompression yes 补充说明RedisZ 中的LZF压缩: LZF 压缩的主要特点和工作原理: 特点 速度快:LZF 主要设计目标是压缩和解压缩速度快,适合实时应用。 工作原理 字典匹配:LZF 通过使用已存在数据的字典进行匹配,找到重复的数据块,从而进行压缩。 动态数据块处理:对于不同大小的数据块,LZF 动态调整压缩策略,以达到最佳性能 11.
//quicklistNode节点的个数 int compressDepth; //压缩算法深度 ... } 为了节约空间 Redis 还会对 ziplist 使用 LZF 大小 int16 count; //ziplist 中元素数量 int2 encoding; //编码形式 存储 ziplist 还是进行 LZF 上面说到 ziplist 可以使用 LZF 算法压缩,通过list-compress-depth配置.默认情况下quicklist 的压缩深度是 0,也就是不压缩.配置为 1 的话代表从头/尾开始第 1
MVStore.Builder(); builder.encryptionKey("my_h2".toCharArray()); /** * 使用 LZF MVStore.Builder(); builder.encryptionKey("my_h2".toCharArray()); /** * 使用 LZF MVStore.Builder(); builder.encryptionKey("my_h2".toCharArray()); /** * 使用 LZF MVStore.Builder(); builder.encryptionKey("my_h2".toCharArray()); /** * 使用 LZF MVStore.Builder(); builder.encryptionKey("my_h2".toCharArray()); /** * 使用 LZF
://github.com/sripathikrishnan/redis-rdb-tools cd redis-rdb-tools python setup.py install 安装 python-lzf ,加快解析速度 pip install python-lzf 推荐 PyPI 安装方式 pip install rdbtools python-lzf 0x02:redis-cli --bigkeys
工具功能 siphash.c Redis 4.0 & 5.0, 采用的是 SipHash 哈希算法 工具功能 pqsort.c, pqsort.h 快速排序(QuickSort)算法的实现 工具功能 lzf_c.c , lzf_d.c, lzf.h, lzfP.h Redis 对字符串和 RDB 文件进行压缩时使用的 LZF 压缩算法的实现。
// ziplist元素数量 /* count of items in ziplist */ unsigned int encoding : 2; // 是否使用压缩,1:没有压缩,2:lzf 压缩 /* RAW==1 or LZF==2 */ unsigned int container : 2; // 预留容器字段 /* NONE==1 or ZIPLIST==2 */ 为了支持quicklist更快的push/pop操作,quicklist首尾两个ziplist是不压缩的,即节点的encoding配置为1,encoding参数表示是否使用压缩,1:没有压缩,2:lzf
整数分别有1,2,4字节表示 image.png 3、如何保存字符串 1、如果服务器打开了RDB文件压缩功能,那么在保存RDB文件的时候就会使用 压缩格式保存,压缩格式如下: REDIS_RDB_ENC_LZF |compressed_len | original_len | compressed_string 其中REDIS_RDB_ENC_LZF会和11放在第一个字节中 2、如果服务器没有开启RDB文件压缩功能