字典压缩

用途

动态字典压缩算法在压缩小数据时有困难。在默认情况下,压缩字典从空开始,并在一次传递输入数据时构造。 因此,小输入导致小字典,不能达到良好的压缩比。

在RocksDB中,基于块的表(SST文件)中的每个块都是单独压缩的。块大小默认为4KB,压缩算法无法从中构建可伸缩的字典。 字典压缩特性使用从多个块中采样的数据来预先设置字典,当多个块之间存在重复时,可以提高压缩比。

用法

将rocksdb::CompressionOptions::max_dict_bytes(在include/rocksdb/options.h中)设置为非零值,表示每个文件字典的最大大小。

另外,还可以使用rocksdb::CompressionOptions::zstd_max_train_bytes生成用于ZStd压缩的最大字节训练字典。 使用ZStd的dictionary trainer可以比单独使用max_dict_bytes获得更好的压缩比改进。 训练数据将用于生成max_dict_bytes字典。

实现

字典压缩只在最底层实现。通过对文件中的整个数据块进行采样,将为子压缩中的每个SST文件构造字典。 当启用字典压缩时,生成的文件中的未压缩数据块将被缓冲到内存中,直到target_file_size字节。一旦达到这个限制,或者文件完成,就从缓冲数据块中均匀/随机地获取数据块,并用于训练ZStd字典训练器。

字典存储在文件的元块中,以便在解压缩时知道它。在读取过程中,如果BlockBasedTableOptions::cache_index_and_filter_blocks为真, 则字典元块缓存在块缓存中,尽管它不像索引和筛选块那样预取。如果为false,则读取字典元块并将其固定在内存中,但不将其加载到块缓存中。

内存中的解压字典是存储在磁盘上的原始字典的摘要形式,并且大小更大。 摘要形式使解压更快,但消耗更多内存。

限制

  • 只适用于最底层
  • 字典元块没有预取到块缓存中