Compression 压缩文本的多个版本,并快速访问每个版本

Compression 压缩文本的多个版本,并快速访问每个版本,compression,Compression,假设我在一个源代码存储库中存储了一个源代码文件的多个版本,可能是一个50k源文件的500个历史版本。因此,直接存储版本大约需要12.5MB(假设文件随时间线性增长)。当然,有足够的压缩空间,因为大多数后续版本之间只有细微的差异 我想要的是紧凑存储,以及在任何时间合理地快速提取任何版本 因此,我们可能会存储一个经常出现的文本块列表,每个版本只包含指向它所组成的块的指针。为了使它真正紧凑,可以将文本块定义为其他块的串联 有没有一种成熟的压缩算法可以产生这种结构?我不知道该找什么词 (如果添加新版本比

假设我在一个源代码存储库中存储了一个源代码文件的多个版本,可能是一个50k源文件的500个历史版本。因此,直接存储版本大约需要12.5MB(假设文件随时间线性增长)。当然,有足够的压缩空间,因为大多数后续版本之间只有细微的差异

我想要的是紧凑存储,以及在任何时间合理地快速提取任何版本

因此,我们可能会存储一个经常出现的文本块列表,每个版本只包含指向它所组成的块的指针。为了使它真正紧凑,可以将文本块定义为其他块的串联

有没有一种成熟的压缩算法可以产生这种结构?我不知道该找什么词


(如果添加新版本比重新压缩整个版本集更快,则会获得额外积分。)

您想要的就是调用。事实上,这正是你想要的。包括奖励积分。

由于没有可用的答案,我今天提出了自己的格式来证明我的意思。我正在存储850个版本的源文件,大小约为20k。通常从一个版本到下一个版本,只添加了一行(但也有其他更改)

如果我将这850个版本存储在一个.zip中,它的大小是4.2MB。我想要的比那少,少很多

我的格式是基于行的。基本上,每个文件版本都以指针列表的形式存储到表中。每个表条目为:

  • 一行字
  • 或是一对指向表格的指针
在第二种情况下,在解压缩过程中,必须依次遵循两个指针

不确定这个描述对你是否有意义,但是

压缩器生成一个文本文件,从中可以立即提取850个版本中的每个版本。此文本文件的大小为45k

最后,我们可以简单地将这个文件压缩到18.5k。比4.2MB有了很大的改进

压缩器使用一种非常简单但有效的方法来查找线的重复组合

因此,对于初始问题的答案是,有一种算法将文件间压缩(如.tar.gz)与即时提取(如包含任何文件)相结合(如.zip)


我还是不知道你怎么称呼这类压缩算法。

我小时候,我们有一种叫做
zip
@Gabriel的东西。呵呵。是的,但在这种情况下,这可能会很大。我想要跨文件压缩。谢谢,但我想要的是算法,不是工具。您可能会提到git的“包文件”(packfiles)。它们似乎将文件存储为其他文件的增量,这与我想要的类似,但并不完全是我想要的,因为当您必须遵循一长串增量才能获得特定版本时,它可能会变得效率低下。首先,它非常快。其次,您不必将其存储为git中的线性历史。它可能是一个树,甚至是一个起始文件中的大量差异。如果您与单个文件存在差异,则压缩会受到影响。如果在一个链中进行差异化,则提取速度会减慢。我正在寻找一种在这两方面都优秀的格式/算法。我还没有在任何地方见过这个。好的,考虑一下,如果使用绳索之类的工具优化解压,那么diff链是非常可行的。