#lz77 #kindle #format #palmdoc

palmdoc-compression

快速且安全的 PalmDoc/MOBI/AZW/Kindle 风格 LZ77 实现

5 个版本

0.3.1 2024年4月14日
0.3.0 2024年4月13日
0.2.3 2024年4月10日
0.2.2 2024年4月10日
0.2.1 2024年4月10日

#1 in #kindle

MIT 许可证

36KB
477

🖐️ palmdoc-compression

docs.rs

这是 PalmDoc 风格 LZ77 压缩(主要用于亚马逊电子书格式)的快速、安全且正确的实现。压缩速度比 Calibre 的实现快 300-400倍,压缩比相当。

此 crate 还包括 Calibre 的版本,用于比较和可选使用,位于 calibre 功能之后。

使用方法

use palmdoc_compression::{compress, decompress};

let data = b"hello world";

let compressed = compress(data);
let decompressed = decompress(&compressed).unwrap();

assert_eq!(data, decompressed);

⚡ 基准测试

MOBI/AZW 文件被分成 4KB 块,因此这里的基准测试也使用 4KB 块。基准测试在 M1 Max 上运行。

对于 4KB 的 lorem ipsum 文本

解压缩 压缩
Calibre 922 MiB/s 252 KiB/s
palmdoc-compression 797 MiB/s 109 MiB/s

对于来自 Project Gutenberg 的《战争与和平》的随机 4KB 块

解压缩 压缩
Calibre 1011 MiB/s 336 KiB/s
palmdoc-compression 876 MiB/s 103 MiB/s

(使用 cargo bench --features calibre 重复。)

压缩比

通过将 Project Gutenberg 的《战争与和平》以 4KB 块压缩计算出的比率。

比率,⬇️ 表示更好
calibre 0.56%(理论最大值)
palmdoc-compression 0.57%

(使用 cargo run --example ratios --release --features calibre 重复。)

致谢

  • LPeter1997 为 Rust LZ77 的清晰易懂实现和 哈希链
  • Calibre 为带有测试的参考实现

依赖关系

~0.2–0.9MB
~20K SLoC