压缩小字符串,用什么创建外部字典?

Chr*_*ris 6 .net c# compression

我想压缩很多小字符串(大约75-100长度的c#字符串).在创建字典时,我已经知道所有短字符串(近一万亿).将来不会有额外的短字符串.我需要额外添加一个字符串而不解压缩其他字符串.

现在我正在寻找一个库或最好的方法来执行以下操作:

  1. 使用我拥有的所有字符串创建字典
  2. 使用此字典压缩每个字符串
  3. 一种使用1中的字典压缩一个字符串的方法.

我找到了一个很好的相关问题,但这不是c#具体的.也许有一些东西可以用于c#我不知道,或者是一个花哨的图书馆,或者有人已经做过.这就是我提出这个问题的原因.

编辑:

有了字典,我正在谈论这样的事情:http://en.wikipedia.org/wiki/Dictionary_coder 但是一切都有助于缩短字符串.字符串是各种语言和URL的短文本消息(30%/ 70%).压缩字符串不需要是人类可读的.它将存储在二进制文件中.

Mar*_*ler 2

如果字符串数量达到一万亿个,那么每个字符串都可以用 40 位(5 个字节)表示。您所需要的只是一种使用 5 字节作为万亿字符串索引的方法。

你怎么知道所有万亿字符串?如果压缩器和解压缩器都可以访问所有万亿字符串,或者如果有办法排序和重新创建字符串,那么您所需要的只是索引。

如果您找不到索引字符串的方法,那么您可以获取字符串的子集并将它们用作压缩器的字典。只需取最具代表性的样本(您需要弄清楚是什么使某些字符串比其他字符串更常见或更能代表其他字符串)并将它们连接到 32K 字典中。大约 400 万亿字符串。然后zlib的压缩端的deflateSetDictionary和解压缩端的inflateSetDictionary,都使用完全相同的32K字典。这将为短弦提供良好的压缩。

  • Deflate 不需要知道字符串在哪里结束。它所寻找的只是最长的匹配字符串。缺少终止 null 会增加匹配的机会。例如,如果您有一个 ABC 字符串和一个 DEF 字符串,并且它们在字典中为 ABCDEF,那么如果正在压缩的数据中碰巧有 BCDE,则该匹配在字典中可用。匹配的最小长度为三,因此常见的单字节或字节对并不重要。 (2认同)