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

时间:2012-06-04 22:32:24

标签: c# .net compression

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

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

  1. 使用我拥有的所有字符串创建字典
  2. 使用此词典压缩每个字符串
  3. 使用1中的字典压缩一个字符串的方法。
  4. 我找到了good related question,但这不是特定于c#的。也许有一些东西可以用于c#我不知道,或者是一个花哨的图书馆,或者有人已经做过。这就是我提出这个问题的原因。

    编辑:

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

2 个答案:

答案 0 :(得分:2)

我没有用它,但Smaz听起来很有希望......

  

Smaz是一个适合压缩的简单压缩库   短串。通用压缩库将构建   动态压缩数据所需的状态,以便能够   压缩各种数据。这是一个非常好的主意,但不适合   具体问题:压缩小字符串不起作用。

     

Smaz反而不适合压缩通用数据,但可以   在一般情况下压缩文本40-50%(使用时更好   英语),并能够为HTML和。执行一些压缩   网址也是。重要的是Smaz能够压缩   甚至两三个字节的字符串!

     

例如,字符串“the”被压缩为单个字节。

由于它是用C语言编写的,请查看Bart De Smet's example for interoping with C through C#

答案 1 :(得分:2)

如果有一万亿个字符串而不是更多,那么每个字符串都可以用40位(5字节)表示。您只需要使用5字节作为万亿字符串的索引。

你怎么知道万亿字符串?如果压缩器和解压缩器都可以访问所有万亿字符串,或者如果有订购方式并重新创建字符串,那么您只需要索引。

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