优化字节对编码

2023-11-25

注意到字节对编码 (BPE)大型文本压缩基准测试非常缺乏,我非常很快就做好了它的一个简单的字面实现。

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

然而,我这个微不足道的实现的运行时间并不那么出色。

如何对此进行优化?是否可以一次性完成?


这是我迄今为止的进展的总结:

谷歌搜索找到了这个链接到原始代码并引用来源的小报告:

菲利普·盖奇,题为“一种新算法” 对于数据压缩',出现了 在《C 用户日志》中 - 二月 1994年版。

多布斯博士网站上的代码链接已损坏,但该网页镜像了它们。

该代码使用hash表来跟踪缓冲区中每次传递所使用的有向图及其计数,以避免每次传递时重新计算新的。

我的测试数据是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 个二合字母;这些被“绘制”并排序,然后与有向图列表合并;这比每次遍历都对整个有向图列表进行排序要快得多,因为该列表是nearly sorted.

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

鉴于 bpev2 的缓冲区交换修复将使穷举搜索与哈希表版本保持一致;我认为哈希表的价值值得商榷,而列表对于这个问题来说是更好的结构。

但它仍然是多通道的。因此它不是一个普遍具有竞争力的算法。

如果你看一下大文本压缩基准,原来的bpe已添加。由于它的块大小较大,因此它在 enwik9 上的性能比我的 bpe 更好。此外,哈希表和我的列表之间的性能差距更接近 - 我将其归结为march=PentiumProLTCB 使用的。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

优化字节对编码 的相关文章

  • 最小硬币找零问题——回溯

    我正在尝试用最少数量的硬币解决硬币找零问题 采用回溯法 我实际上已经完成了它 但我想添加一些选项 按其单位打印硬币数量 而不仅仅是总数 这是我下面的Python代码 def minimum coins coin list change mi
  • 将图的 BFS 代码转换为 DFS 代码

    如果这个问题听起来模棱两可 我很抱歉 但我在采访中被问到了这个问题 为图 树中的 BFS 编写一个程序 我使用队列编写了流行的代码 现在他要求我通过修改我刚刚编写的 BFS 代码的一行来将其转换为 DFS 代码 我能想到的唯一答案是使用堆栈
  • 访问三个静态数组比访问一个包含 3 倍数据的静态数组更快?

    我有 700 个项目 我循环遍历这 700 个项目 为每个项目获取项目的三个属性并执行一些基本计算 我使用两种技术实现了这一点 1 三个 700 元素的数组 三个属性各一个数组 所以 item0 a array1 0 item0 b arr
  • GCC 优化对位操作的有效性

    以下是在 x86 64 上设置 C 中单个位的两种方法 inline void SetBitC long array int bit Pure C version array 1 lt
  • 将 0 更改为 1 或反之亦然的最优雅的方式

    做接下来的事情最优雅的方式是什么 int i oneOrZero if i 0 i 1 else i 0 你可以假设i只能有 1 或 0 值 i 1 XOR https en wikipedia org wiki Exclusive or值
  • 在地图元素上使用 for_each

    我有一个映射 我想在其中对每个数据类型对象成员函数执行调用 我还知道如何在任何序列上执行此操作 但是是否可以在关联容器上执行此操作 我能找到的最接近的答案是 Boost Bind 访问 std for each 中的 std map 元素
  • 按字母/字典顺序排列的两个字符串的平均值

    假设您采用字符串 a 和 z 并按字母顺序列出它们之间的所有字符串 a b c x y z 取这个列表的中点 你就会找到 m 所以这有点像取这两个字符串的平均值 您可以将其扩展到具有多个字符的字符串 例如 aa 和 zz 之间的中点将位于列
  • Tarjan 算法的非递归版本

    我有以下 Tarjan 算法的 递归 实现来查找图中的强连接组件 并且工作正常 public class StronglyConnectedComponents public static List
  • ASM 中从小端到大端的快速转换

    我在 C 中有一个 uint 类型数组 在检查程序是否在小端机器上运行后 我想将数据转换为大端类型 因为数据量可能会变得非常大 但总是均匀的 所以我想考虑将两个 uint 类型作为 ulong 类型 以获得更好的性能并在 ASM 中对其进行
  • 将平面表解析为树的最有效/优雅的方法是什么?

    假设您有一个存储有序树层次结构的平面表 Id Name ParentId Order 1 Node 1 0 10 2 Node 1 1 1 10 3 Node 2 0 20 4 Node 1 1 1 2 10 5 Node 2 1 3 10
  • 拓扑排序卡恩算法 BFS 或 DFS

    拓扑排序的方法是BFS还是DFS 哪个正确 我认为BFS是对的 但有些网站说DFS 有些网站说BFS 我很困惑 卡恩算法与 BFS 或 DFS 相同吗 或者BFS 或DFS 只是卡恩算法的工具 Kahn算法和DFS在实践中都用于拓扑排序 选
  • 超越堆栈采样:C++ 分析器

    黑客的故事 日期是 2010 年 2 月 12 日 圣诞节前的日子已经过去了 作为一名 Windows 程序员 我几乎遇到了一个主要障碍 我一直在使用 AQTime 我尝试过 sleepy shiny very sleepy 就在我们说话的
  • Deflate 压缩 - 数值示例

    我真的很想看看一个数字示例 手动压缩如何进行压缩 以下非常短的文本 abc 已使用 deflate 算法进行压缩 输出 eJxLTEoGAAJNASc 其二进制表示法为 01100101 01001010 01111000 01001100
  • 我怎样才能优化这个vba循环代码?

    嗨 我写了这段代码 但这段代码非常慢 我该如何优化这段代码 Private Sub printItem r lastCol objStream FirstCol 1 Dim strFirst As String strFirst CStr
  • com.jcraft.jsch.JSchException:算法协商失败

    我正在尝试从客户端计算机连接 sftp 服务器 但是 com jcraft jsch JSchException 算法协商失败 我收到这种错误 com jcraft jsch JSchException Algorithm negotiat
  • 递归分层父子

    我有一个来自数据库的项目集合 该数据库具有parentid值或空 这是我的班级设计 public class Item public int id get set public string Name get set public int
  • 如何编写一个简单的版本控制系统?

    我想做一个简单的版本控制系统 但我不知道如何构建我的数据和代码 这是一个简短的例子 用户登录 User has two options when uploading a file 提交新文件 提交文件的新版本 用户应该能够看到树 版本不同
  • 多线程归并排序,添加额外的线程

    我在java中的多线程合并排序算法中面临一个问题 我应该将代码修改为 3 4 5 6 7 8 线程合并排序 将原始数组划分为subArrays 目前它有2subArrays 如何将原始数组拆分为 3 4 5 6 7 8subArray是为了
  • 准备与大数据相关的设计和架构问题的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 递归最长递增子序列的记忆

    我为最长递增子序列提出了简单的以下递归解决方案 但是 您可以帮助将记忆包含到这个递归解决方案中吗 public int findLIS int a int maxSoFar int item int count if item a leng

随机推荐