23个版本
0.11.3 | 2023年1月26日 |
---|---|
0.11.1 | 2022年12月12日 |
0.11.0 | 2022年11月29日 |
0.10.1 | 2022年6月23日 |
0.9.2 | 2021年10月17日 |
140 在 压缩 类别中
19,376 每月下载量
用于 19 个crate(直接使用18个)
2MB
3K SLoC
⛓️gzp
多线程编码和解码。
为什么?
这个crate提供了一个几乎可以无缝替换的Write
实现,它可以在并行中将数据块压缩并按写入器接收字节的顺序写入底层写入器。这允许以更快的速度压缩数据。
此外,它还提供了Mgzip和BGZF格式的多线程解压缩器。
支持的编码
- 通过flate2使用Gzip
- 通过flate2使用Zlib
- 通过flate2使用原始Deflate
- 通过rust-snappy使用Snappy
- BGZF 块压缩格式,限制为64 Kb块
- Mgzip 块压缩格式,没有块大小限制
用法/特性
默认情况下,gzp
启用了deflate_default
和libdeflate
特性,这将为flate2
引入最佳性能的zlib
实现,并为块gzip格式提供libdeflater
。
示例
- Deflate默认
[dependencies]
gzp = { version = "*" }
- Rust后端,这意味着Zlib格式将不可用。
[dependencies]
gzp = { version = "*", default-features = false, features = ["deflate_rust"] }
- Snap仅限
[dependencies]
gzp = { version = "*", default-features = false, features = ["snap_default"] }
示例
简单示例
use std::{env, fs::File, io::Write};
use gzp::{deflate::Gzip, ZBuilder, ZWriter};
fn main() {
let mut writer = vec![];
// ZBuilder will return a trait object that transparent over `ParZ` or `SyncZ`
let mut parz = ZBuilder::<Gzip, _>::new()
.num_threads(0)
.from_writer(writer);
parz.write_all(b"This is a first test line\n").unwrap();
parz.write_all(b"This is a second test line\n").unwrap();
parz.finish().unwrap();
}
pgz的更新版本。
use gzp::{
ZWriter,
deflate::Mgzip,
par::{compress::{ParCompress, ParCompressBuilder}}
};
use std::io::{Read, Write};
fn main() {
let chunksize = 64 * (1 << 10) * 2;
let stdout = std::io::stdout();
let mut writer: ParCompress<Mgzip> = ParCompressBuilder::new().from_writer(stdout);
let stdin = std::io::stdin();
let mut stdin = stdin.lock();
let mut buffer = Vec::with_capacity(chunksize);
loop {
let mut limit = (&mut stdin).take(chunksize as u64);
limit.read_to_end(&mut buffer).unwrap();
if buffer.is_empty() {
break;
}
writer.write_all(&buffer).unwrap();
buffer.clear();
}
writer.finish().unwrap();
}
相同的事情,但使用Snappy。
use gzp::{parz::{ParZ, ParZBuilder}, snap::Snap};
use std::io::{Read, Write};
fn main() {
let chunksize = 64 * (1 << 10) * 2;
let stdout = std::io::stdout();
let mut writer: ParZ<Snap> = ParZBuilder::new().from_writer(stdout);
let stdin = std::io::stdin();
let mut stdin = stdin.lock();
let mut buffer = Vec::with_capacity(chunksize);
loop {
let mut limit = (&mut stdin).take(chunksize as u64);
limit.read_to_end(&mut buffer).unwrap();
if buffer.is_empty() {
break;
}
writer.write_all(&buffer).unwrap();
buffer.clear();
}
writer.finish().unwrap();
}
致谢
- 这个crate中许多想法直接受到
pigz
的启发,包括一些函数的实现细节。
贡献
PRs非常欢迎!请在本地上运行测试并确保它们通过。许多测试在CI中被忽略,因为CI实例没有足够的线程来测试它们/速度太慢。
cargo test --all-features && cargo test --all-features -- --ignored
请注意,测试将花费30-60秒。
未来的待办事项
- 引入adler crate以替换zlib实现(需要一个可以组合值的crate,可能需要实现pigz的COMB)。
- 向头部添加更多元数据
- 为BGZF/Mgzip格式返回自动生成的索引
- 尝试使用https://docs.rs/lzzzz/0.8.0/lzzzz/lz4_hc/fn.compress.html
基准测试
所有基准测试都是在文件 ./bench-data/shakespeare.txt
上进行的,该文件被连接了100次,从而生成了一个大约550Mb的大文件。
主要的基准测试结果是,压缩时间与使用的线程数量成比例减少。