使用静态字典压缩字符串



这将是一个有点抽象的问题,因为我什至不知道是否有这样的发展。

假设我们有一个应用程序,它试图将文本数据从 A 点传递到 B 点。 A 和 B 相距很远,因此数据大小对我们想要优化的所有重要指标(速度、延迟和吞吐量)都有重大影响。首先想到的是压缩,但是当我们必须压缩许多小消息时,压缩并不是那么有效,但是当压缩数据的大小很大时,压缩非常有效。

我没有压缩算法的经验,但我的理解是,输入越大,压缩率就越好,因为重复块和可以优化的东西的可能性更大。

我们可以采取的另一种方法是批处理,通过等待 N 个时间段并收集所有小消息并创建一个压缩的大消息,我们可以具有良好的压缩率,但我们会牺牲延迟,首先到达的消息将花费不必要的延迟 N。

我正在寻找的解决方案是这样的,当压缩算法遍历数据集时,它可能有一些它知道可以优化的事物字典。每次我们完成压缩时,这本字典都会被扔掉,它总是与消息一起发送给 B。

rawMsg -> [dictionary|compressedPayload] -> send to B

但是,如果我们可以将此字典维护在内存中,并且仅在其中发生变化时才发送,这意味着我们可以有效地压缩即使是小消息,并避免每次都将字典发送到另一端......

rawMsg -> compress(existingDictrionaryOfSomeVersion, rawMsg) -> [dictionaryVersion|compressedPayload] -> send to B

现在显然这里的假设是 B 也将保留字典的实例,并在新版本到来时不断更新它。

请注意,protobuffix(在金融应用程序中)等协议已经发生了这种情况。 对于任何消息,您都有模式(字典),并且两端都可用,然后您只需发送原始二进制数据,高效且快速,但您的模式是固定且不变的。

我正在寻找可用于自由格式文本的东西。

是否有任何技术可以做到这一点(没有一些固定的模式)?

您可以简单地在单个压缩流中发送许多小消息。然后,他们将能够利用以前的小消息历史记录。使用 zlib,您可以清除每条消息,这将避免在传输之前等待整个块的构建。这将降低压缩性能,但不会像尝试单独压缩每个字符串那样严重(这最终可能会扩展它们)。对于 zlib,您的字典始终是您发送的最后 32K 条消息。

最新更新