VLDB: Fast Static Symbol Table (FSST): fast text compression that allows random access

这篇paper提出一种快速实现对“短字符串”进行压缩和解压缩的算法,并且可以提供“Random Access”的能力。

通过对比lz4(当前最优秀的通用压缩算法),发现LZ4在几k数据的情况下,压缩较好。而对于较短的字符串,处理并不好。一般都是将字符串列的多列数据放在一起组成一个block,然后交给lz4进行统一压缩。采用字典压缩。

此外,业界在int类型压缩上研究较为成熟,对于字符串的压缩,没有做到特别好。一般都是按照字典压缩,将字符串转换为int数据,然后可以对int数据再进一步压缩。但很少对字符串字典本身做压缩处理。并且也不支持能够随机访问,即,需要将整个block解压缩后进行访问,而对于非连续访问的情况,通常仅仅访问其中少量的数据,效率不高。

字符串压缩也有一些提出的方案,比如order-preserve的可以保证序,这在一篇2009年的论文中被提出,使用了tree,具体还没去读原论文。

这篇文章提到的方案是,对压缩的字符串进行采样抽取片段,然后对片段进行静态编码为一个1-255的byte,而这个片段也不长,最多8个字符串长度。这些小片段为编码单位。然后使用这个表对字符串集合进行逐个的编码,解码也一样,使用这个表去查表就能解码。从这个方案可以看到,得确具备随机访问的能力。

充分使用AVX-512指令,使压缩并行化进行,可以同时处理8个压缩:

压缩/解压分2步3个API:

/* Calibrate a FSST symboltable from a batch of strings (it is best to provide at least 16KB of data). */
fsst_encoder_t*
fsst_create(size_t n,         /* IN: number of strings in batch to sample from. */size_t lenIn[],   /* IN: byte-lengths of the inputs */unsigned char *strIn[],  /* IN: string start pointers. */int zeroTerminated       /* IN: whether input strings are zero-terminated. If so, encoded strings are as well (i.e. symbol[0]=""). */
);

这一步根据输入的采样字符串集合构造静态编码表,编码表的构造在论文中有大致的算法,在github上有完整的代码。

编码表结构如下:

/* Data structure needed for decompressing strings - read-only and thus can be shared between multiple decompressing threads. */
typedef struct {unsigned long long version;     /* version id */unsigned char zeroTerminated;   /* terminator is a single-byte code that does not appear in longer symbols */unsigned char len[255];         /* len[x] is the byte-length of the symbol x (1 < len[x] <= 8). */unsigned long long symbol[255]; /* symbol[x] contains in LITTLE_ENDIAN the bytesequence that code x represents (0 <= x < 255). */
} fsst_decoder_t;

然后可以进行压缩了:

/* Compress a batch of strings (on AVX512 machines best performance is obtained by compressing more than 32KB of string volume). */
/* The output buffer must be large; at least "conservative space" (7+2*inputlength) for the first string for something to happen. */
size_t                      /* OUT: the number of compressed strings (<=n) that fit the output buffer. */
fsst_compress(fsst_encoder_t *encoder, /* IN: encoder obtained from fsst_create(). */size_t nstrings,         /* IN: number of strings in batch to compress. */size_t lenIn[],          /* IN: byte-lengths of the inputs */unsigned char *strIn[],  /* IN: input string start pointers. */size_t outsize,          /* IN: byte-length of output buffer. */unsigned char *output,   /* OUT: memory buffer to put the compressed strings in (one after the other). */size_t lenOut[],         /* OUT: byte-lengths of the compressed strings. */unsigned char *strOut[]  /* OUT: output string start pointers. Will all point into [output,output+size). */
);

解压缩一样,要传入静态编码表:

/* Decompress a single string, inlined for speed. */
inline size_t /* OUT: bytesize of the decompressed string. If > size, the decoded output is truncated to size. */
fsst_decompress(fsst_decoder_t *decoder,  /* IN: use this symbol table for compression. */size_t lenIn,             /* IN: byte-length of compressed string. */unsigned char *strIn,     /* IN: compressed string. */size_t size,              /* IN: byte-length of output buffer. */unsigned char *output     /* OUT: memory buffer to put the decompressed string in. */
)

源代码链接

https://github.com/cwida/fsst

输入n个字符串字典序排序_FSST - 快速字符串压缩算法相关推荐

  1. python字符串去重排序_python实现字符串转数字排序-女性时尚流行美容健康娱乐mv-ida网...

    女性时尚流行美容健康娱乐mv-ida网 mvida时尚娱乐网 首页 美容 护肤 化妆技巧 发型 服饰 健康 情感 美体 美食 娱乐 明星八卦 首页  > 高级搜索 python 取子 字符 串 ...

  2. 输入n个字符串字典序排序_30个Python奇淫技巧集

    今天小编熬夜整理了一份,内容是基础篇覆盖了字符串,列表,字典和基础序列容器.不要小看青铜篇,这份资料里面收集了很多奇淫技巧,很多小编也是第一次遇到,非常值得收藏. 下面我挑选几个给大家看一下,小编觉得 ...

  3. java字符串字典排序_java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...

  4. Java字符串数组字典序排序

    Java字典序排序 1. String[] 字符串数组 1) 正序排序 2)逆序排序 2. String 字符串 3. int[] 整数数组 4.int[]降序排序 5.int[]两个条件排序 1. ...

  5. java map字典序_java中对map的字典序排序

    java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115& ...

  6. 字典序 java_java实现对map的字典序排序操作示例

    本文实例讲述了java实现对map的字典序排序操作.分享给大家供大家参考,具体如下: java中对map的字典序排序,算法验证比对微信官网https://mp.weixin.qq.com/wiki?t ...

  7. Java黑皮书课后题第7章:**7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串。编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串

    **7.34(对字符串中的字符排序)使用以下方法头编写一个方法,返回一个排序好的字符串.编写一个测试程序,提示用户输入一个字符串,显示排序好的字符串 题目 题目描述 破题 代码 运行实例 题目 题目描 ...

  8. php 字符串 字典序序排序,C++ 怎么实现字典序排序法,自然排序

    C++ 如何实现字典序排序法,自然排序 类似PHP的natcasesort函数,整了一天没有头绪. 数组是vector 排序前: [0] => IMG0.png [1] => IMG3.p ...

  9. 字符串的排序不一定要完全按照字典序(洛谷P1012题题解,Java语言描述)

    题目要求 P1012题目链接 分析 直接按照字符串处理,可以按照字典序排序. 但这样存在问题: 比如32和321,我们按照字典序进行排序"321">"32" ...

最新文章

  1. Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)
  2. VMware / 三种联网方法及原理
  3. Android NDK调试定位错误
  4. python最常用的版本、也称为classic_2021年中国大学《创新思维与创业》单元测试答案...
  5. java 获取指定后缀名的文件
  6. 用Maven创建第一个web项目Struts2项目
  7. 使用pscp实现Windows 和 Linux服务器间远程拷贝文件
  8. 搭建你的Spring.Net+Nhibernate+Asp.Net Mvc 框架 (三)实现数据库接口层和业务逻辑层(转)...
  9. c 自定义实现string类 clear_JVM类加载器是否可以加载自定义的String
  10. office 2021安装教程+下载
  11. python中excel数据分组处理
  12. Vi下编辑和退出编辑方法
  13. OpenPLC61850: An IEC 61850 MMS compatible open source PLC for smart grid research
  14. 外企面试英文自我介绍【面试经验】
  15. 工业自动控制过程中最好用SCADA软件推荐
  16. 自考本科计算机专业英语作文,成人学位英语作文万能模板
  17. VUE监听页面刷新和关闭事件
  18. DeePin系统安装jdk以及eclipse
  19. 最近想到的一些事情。
  20. 某博搜索话题采集分析Python爬虫

热门文章

  1. python 字符串数组互转
  2. 线性代数的本质 - 02 - 线性组合、张成的空间与基
  3. sh ndk-build.cmd command not found
  4. matlab计时,暂停
  5. Windows server 2016 添加盘符为D盘的数据盘
  6. 计算机应用基础 黄国兴 研读,《计算机应用基础》大纲解读黄国兴
  7. oracle数据库可以存图片吗,如何往数据库(Oracle)里存储图片和文件
  8. java set和get原理_Java线程池的实现原理和使用
  9. idl linux运行效率,Linux性能优化实战 CPU篇 阅读笔记
  10. java打印版本兼容_打印class文件的Java编译器内部的版本号