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

本文关键字:创建 外部 字典 什么 缩小 字符串 压缩 | 更新日期: 2023-09-27 18:36:24

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

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

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

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

编辑:

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

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

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

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

如果找不到索引字符串

的方法,则可以获取字符串的子集并将它们用作压缩器的字典。 只需选取最具代表性的样本(您需要找出可能使某些字符串比其他字符串更常见或更能代表其他字符串的原因),并将它们连接成 32K 字典。 大约 400 万亿串。 然后 zlib 的 deflateSetDictionary 在压缩端,inflateSetDictionary 在解压缩端,两者都使用完全相同的 32K 字典。 这将在短字符串上提供良好的压缩。

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

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

相反,Smaz 不适合压缩通用数据,但可以 在平均情况下将文本压缩 40-50%(适用于 英语),并且能够对 HTML 和 网址也是如此。重要的一点是 Smaz 能够压缩 甚至是两个或三个字节的字符串!

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

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