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压缩 类别中

Download history 4941/week @ 2024-04-20 4281/week @ 2024-04-27 3154/week @ 2024-05-04 3635/week @ 2024-05-11 4898/week @ 2024-05-18 3590/week @ 2024-05-25 3783/week @ 2024-06-01 3596/week @ 2024-06-08 4686/week @ 2024-06-15 4271/week @ 2024-06-22 3201/week @ 2024-06-29 3089/week @ 2024-07-06 5060/week @ 2024-07-13 4316/week @ 2024-07-20 5784/week @ 2024-07-27 3691/week @ 2024-08-03

19,376 每月下载量
用于 19 个crate(直接使用18个)

Unlicense/MIT许可

2MB
3K SLoC

⛓️gzp

Build Status license Version info

多线程编码和解码。

为什么?

这个crate提供了一个几乎可以无缝替换的Write实现,它可以在并行中将数据块压缩并按写入器接收字节的顺序写入底层写入器。这允许以更快的速度压缩数据。

此外,它还提供了Mgzip和BGZF格式的多线程解压缩器。

支持的编码

  • 通过flate2使用Gzip
  • 通过flate2使用Zlib
  • 通过flate2使用原始Deflate
  • 通过rust-snappy使用Snappy
  • BGZF 块压缩格式,限制为64 Kb块
  • Mgzip 块压缩格式,没有块大小限制

用法/特性

默认情况下,gzp启用了deflate_defaultlibdeflate特性,这将为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秒。

未来的待办事项

基准测试

所有基准测试都是在文件 ./bench-data/shakespeare.txt 上进行的,该文件被连接了100次,从而生成了一个大约550Mb的大文件。

主要的基准测试结果是,压缩时间与使用的线程数量成比例减少。

benchmarks

依赖项