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 在 压缩
204 每月下载量
用于 5 个crate(4个直接使用)
210KB
5.5K SLoC
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::SignedLike
和 q_compress::types::UnsignedLike
。
搜索和分位数统计
请记住,每个块都有一个包含以下内容的元数据部分:
- 数据块中数字的总数,
- 数据块的取值范围以及每个范围内的数字数量,
- 以及压缩体的字节数。
使用压缩体的字节数,可以轻松地遍历整个文件并收集所有数据块元数据的列表。可以将它们聚合起来以获得整个文件中数字的总数,甚至是一个近似直方图。这通常比解压缩所有数字快100倍。
参见快速搜索示例。