选择压缩比最高的压缩算法

Choosing compression algorithm with highest compression ratio

我正在寻找一种压缩算法:

目标:

  1. 压缩 800 万个双精度浮点数的密集数组。只有 256 个唯一值。值呈正态分布。 (主要用例)
  2. 与以前相同,但用于稀疏数组(包含很多 0 值)

我可以为这些用例使用 2 种不同的算法。

我找到了 Google 的 Brotli 算法。但是不知道是不是最好的

编码几乎是一个已解决的问题:您的主要任务将是 建模(从 float numberlossless 开始)。
[primarily dense arrays] of 256 unique float numbers 听起来不太乐观:根据范围,指数表示可能是可利用冗余的唯一来源。
sparse array 听起来很有前途,16×16 稀疏矩阵更是如此。您对数据了解得越多,就越能帮助压缩器 - "mainly diagonal matrix",有人吗?

"General purpose data compressors" 利用自相似性:
要了解您的数据在哪里,请在您选择的任何 "machine representation" 和通用 unicode 表示上使用 "the usual suspects"。
后者允许您使用不超过要求的分辨率。

我有很多浮点数。但是因为只有 256 个唯一值,我可以将每个数字编码为 1 个字节。它提供了巨大的压缩比。 之后我可以 运行 一些通用算法来进一步压缩数据。 我检查了几种流行的算法:gzip、Brotli、bzip2、lzma、Zstandard。

我发现有 2 个选项符合我的需要:

  • bzip2
  • 布罗特里

bzip2:

  • 即使我不将浮点数转换为无符号字节,也能很好地压缩。
  • 但需要浏览器中的 JS 库

布罗特里:

  • 只有在我之前手动将所有浮点数映射到无符号字节时才能很好地压缩
  • 几乎所有现代浏览器都原生支持