6

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

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

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

我找到了一个很好的相关问题,但这不是 c# 特定的。也许有一些我不知道的 c# 的东西,或者一个花哨的库或者有人已经这样做了。这就是我问这个问题的原因。

编辑:

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

4

2 回答 2

2

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

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

相反,Smaz 不适合压缩通用数据,但在平均情况下可以将文本压缩 40-50%(对英语效果更好),并且还能够对 HTML 和 url 执行一些压缩。重要的一点是,Smaz 甚至能够压缩两个或三个字节的字符串!

例如,字符串“the”被压缩成一个字节。

由于它是用 C 编写的,请查看Bart De Smet 的示例,以通过 C# 与 C 进行互操作

于 2012-06-04T22:42:58.717 回答
2

如果有一万亿个字符串并且没有更多,那么每个字符串都可以用 40 位(5 个字节)表示。您所需要的只是一种将 5 字节用作万亿字符串的索引的方法。

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

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

于 2012-06-05T05:07:33.397 回答