压缩库具有提取特定项目的能力

时间:2014-07-08 11:46:42

标签: .net windows compression

我有一个Windows桌面应用程序,其中包含以下设置:

(1)当应用程序运行时,将生成许多长字符串:string1,string2,string3,...

(2)字符串类似,例如string8将是string7加上一个小变化。

(3)应用程序的用户可能希望查看已生成的任何字符串。因此用户可能会查看string3,然后是string1,然后是string9。

我想使用压缩库来减少存储所有这些字符串所需的空间。特别是我想要一个压缩库:

(1)可以将每个新字符串添加到现有的“存档”(只是内存存储)

(2)动态调整压缩字典(例如LZ77),以利用 事实上,每个新字符串都与前一个字符串类似。

(3)允许我提取已添加到“存档”的特定字符串。因此,例如,如果存档包含字符串1-10,000,我希望能够提取string314而无需解压缩整个“存档”。这主要是为了速度,并且避免在任何时候将整个解压缩的存档存储在内存中。

我原以为GIT会为文件修改做类似的事情,虽然我不确定。我相信GIT使用zlib,但是在查看zlib文档时,它看起来并不像上面的工作流程一样。

注意:我意识到我可以存储字符串的差异。但是我宁愿存放整个字符串以保证安全。

1 个答案:

答案 0 :(得分:0)

关于git:我得到的印象是,使用git在通过网络传输数据时使用了压缩。我不认为它存储压缩的差异。但这只是基于使用该程序时的经验观察的猜测。

以下是基于Huffman codes的可能解决方案:

  • 扫描所有字符串并构建字符频率表。
  • 使用频率表更有效地编码每个字符串。
  • 将每个字符串填入文件并跟踪每个字符串的偏移量。
  • 创建一个单独的索引,其中包含每个字符串的偏移量。该索引也可以保存字符频率表。

需要使用这些字符串的程序将读取字符频率表并基于此构建霍夫曼树/表。然后,如果它需要string314,它会查找表中的偏移#314,跳转到连接的压缩字符串文件中的点,然后开始解压缩该字符串。