Skip to content

dengzhongyuan365-dev/pzip-cpp

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

pzip-cpp

高性能并行 ZIP 压缩工具,C++ 实现。

简介

pzip-cpp 是 Go 语言 pzip 的 C++ 移植版本,针对大量小文件的压缩场景进行了优化。

特性

  • 🚀 高性能:多线程并行压缩,接近官方 Go 版性能
  • 📦 标准兼容:生成标准 ZIP 格式,支持 ZIP64
  • 🔧 易于集成:可作为库集成到其他项目
  • 💻 跨平台:支持 Linux(ARM/x86)

性能对比

在 ARM 平台压缩 2.5GB 碎文件:

工具 耗时
pzip-cpp 3.9s
pzip (Go) 2.7s
zip (单线程) ~60s

编译

依赖

  • CMake 3.14+
  • C++17 编译器
  • zlib

构建

mkdir build && cd build
cmake ..
make -j$(nproc)

使用

命令行

# 压缩文件或目录
./pzip output.zip /path/to/files

# 静默模式
./pzip -q output.zip /path/to/files

# 解压
./punzip input.zip [output_dir]

库使用

#include <pzip/archiver.hpp>

// 压缩
pzip::ArchiverOptions options;
options.concurrency = 8;        // 并发数
options.compressionLevel = 1;   // 压缩级别 (1=最快, 9=最高压缩率)

pzip::Archiver archiver("output.zip", options);
pzip::Error err = archiver.archive({"/path/to/dir"});
if (err) {
    std::cerr << "Error: " << err.message() << std::endl;
}
archiver.close();
#include <pzip/extractor.hpp>

// 解压
pzip::ExtractorOptions options;
options.concurrency = 8;

pzip::Extractor extractor("input.zip", options);
pzip::Error err = extractor.extract("/output/dir");
if (err) {
    std::cerr << "Error: " << err.message() << std::endl;
}

架构

┌─────────────────────────────────────────────┐
│                 Archiver                     │
│  ┌───────────────┐    ┌──────────────────┐  │
│  │ ProcessPool   │───>│   WriterPool     │  │
│  │ (并行压缩)     │    │  (顺序写入ZIP)    │  │
│  └───────────────┘    └──────────────────┘  │
└─────────────────────────────────────────────┘
  • FileProcessPool:多线程并行读取和压缩文件
  • FileWriterPool:单线程顺序写入 ZIP(ZIP 格式要求)
  • FastDeflate:高性能 DEFLATE 压缩器,参考 klauspost/compress

文档

详细设计文档见 docs/DESIGN.md

许可证

MIT License

致谢

About

pzip-cpp 参考pzip以及klauspost/compress (Go) 官方代码实现的cpp代码

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published