一尘不染

优化字节对编码

algorithm

注意到大型文本压缩基准测试中非常缺少字节对编码(BPE),因此我
很快对其进行 了简单的文字实现。

考虑到没有进一步的处理,例如没有霍夫曼编码或算术编码,压缩率非常好。

但是,我微不足道的实现的运行时间并不算太好。

如何进行优化?是否可以通过一次通过?


阅读 320

收藏
2020-07-28

共1个答案

一尘不染

这是到目前为止我的进步的总结:

Googling
发现了这个链接到原始代码的小报告,并引用了源代码:

菲利普·盖奇(Philip Gage)题为“一种新的数据压缩算法”,出现在1994年2月版的《 The C Users Journal》中。

Dr Dobbs网站上的代码链接已断开,但该网页反映了它们。

该代码使用 哈希 表来跟踪缓冲区中每次通过的使用的有向图及其计数,从而避免了重新计算每次通过时的新鲜度。

我的测试数据是enwik8胡特奖

|----------------|-----------------|
| Implementation | Time (min.secs) |
|----------------|-----------------|
| bpev2          | 1.24            | //The current version in the large text benchmark
| bpe_c          | 1.07            | //The original version by Gage, using a hashtable
| bpev3          | 0.25            | //Uses a list, custom sort, less memcpy
|----------------|-----------------|

bpev3
创建所有图的列表;这些块的大小为10KB,通常在阈值之上有200个左右的图(为4,这是我们可以通过压缩获得的最小字节);对该列表进行排序并进行第一个替换。

进行替换时,统计信息会更新;通常,每个通行证仅改变约10或20个有向图;将这些“绘画”并排序,然后与有向图列表合并;这比每次通过总是对整个有向图列表进行排序要快得多,因为列表
几乎被 排序了。

原始代码在“ tmp”和“ buf”字节缓冲区之间移动;bpev3只是交换缓冲区指针,仅运行时就价值约10秒。

鉴于对bpev2的缓冲区交换修复将使详尽搜索与哈希表版本保持一致;我认为哈希表是可以争论的值,并且列表是解决此问题的更好结构。

它的门槛多通不过。因此,它不是一种普遍竞争的算法。

如果您查看大文本压缩基准,则已添加了原始bpe。由于块大小较大,因此它的性能比我在enwik9上的bpe更好。而且,哈希表和我的列表之间的性能差距更小-
我将其归结为march=PentiumProLTCB使用的。

当然,在某些场合它是合适的和被使用的。Symbian使用它来压缩ROM映像中的页面。我推测Thumb二进制文件的16位性质使其成为一种简单而有益的方法。压缩是在PC上完成的,解压缩是在设备上完成的。

2020-07-28