#分位数 #数值 #delta #时间序列

q_compress

适用于数值序列和时间序列的良好压缩

29次发布

0.11.7 2023年7月7日
0.11.5 2023年2月5日
0.11.4 2022年11月19日
0.11.1 2022年7月24日
0.2.2 2021年7月19日

#97压缩

Download history 285/week @ 2024-03-11 223/week @ 2024-03-18 220/week @ 2024-03-25 326/week @ 2024-04-01 297/week @ 2024-04-08 447/week @ 2024-04-15 575/week @ 2024-04-22 86/week @ 2024-04-29 84/week @ 2024-05-06 76/week @ 2024-05-13 103/week @ 2024-05-20 124/week @ 2024-05-27 61/week @ 2024-06-03 76/week @ 2024-06-10 58/week @ 2024-06-17 4/week @ 2024-06-24

204 每月下载量
用于 5 个crate(4个直接使用)

Apache-2.0

210KB
5.5K SLoC

Crates.io

q_compress

作为独立格式的使用

use q_compress::{auto_compress, auto_decompress, DEFAULT_COMPRESSION_LEVEL};

fn main() {
  // your data
  let mut my_ints = Vec::new();
  for i in 0..100000 {
    my_ints.push(i as i64);
  }
 
  // Here we let the library choose a configuration with default compression
  // level. If you know about the data you're compressing, you can compress
  // faster by creating a `CompressorConfig`.
  let bytes: Vec<u8> = auto_compress(&my_ints, DEFAULT_COMPRESSION_LEVEL);
  println!("compressed down to {} bytes", bytes.len());
 
  // decompress
  let recovered = auto_decompress::<i64>(&bytes).expect("failed to decompress");
  println!("got back {} ints from {} to {}", recovered.len(), recovered[0], recovered.last().unwrap());
}

要立即运行某些内容,请尝试 基准测试

对于允许一次写入/读取一个块并提取所有元数据的更低级别的独立API,请参阅 docs.rs 文档

作为包装格式的使用

要将 q_compress 嵌入/交织到另一个数据格式中,最好使用 包装API和格式 而不是独立使用。请参阅 包装时间序列 示例。这允许

  • 在页面大小大于20个数字时进行精细级别数据分页,同时保持良好的压缩比(只要整个块的大小大于2k左右)
  • 通过省略包装格式必须保留的元数据来减少冗余

库变更日志

请参阅 changelog.md

高级

自定义数据类型

小数据类型可以在扩展中有效地压缩:例如,将 u8 数据作为一系列 u16 值压缩。使用更大数据类型唯一的成本是块元数据大小略有增加。

当需要时,您可以通过 q_compress::types::NumberLike 实现您自己的数据类型,并且(如果现有的有符号/无符号实现不足)通过 q_compress::types::SignedLikeq_compress::types::UnsignedLike

搜索和分位数统计

请记住,每个块都有一个包含以下内容的元数据部分:

  • 数据块中数字的总数,
  • 数据块的取值范围以及每个范围内的数字数量,
  • 以及压缩体的字节数。

使用压缩体的字节数,可以轻松地遍历整个文件并收集所有数据块元数据的列表。可以将它们聚合起来以获得整个文件中数字的总数,甚至是一个近似直方图。这通常比解压缩所有数字快100倍。

参见快速搜索示例

无运行时依赖