【发布时间】:2010-09-28 13:44:43
【问题描述】:
在通过网络发送数据包之前,最好的压缩算法是什么?数据包使用 JSON 编码。 LZW 会是一个很好的选择还是有更好的选择?
【问题讨论】:
-
我不知道算法,但也许这个项目和你很相似github.com/rgcl/jsonpack
标签: json compression packet
在通过网络发送数据包之前,最好的压缩算法是什么?数据包使用 JSON 编码。 LZW 会是一个很好的选择还是有更好的选择?
【问题讨论】:
标签: json compression packet
嗯...如果我错了,请纠正我,但是如果您正在实施在线压缩,那么您可以控制连接的两端,对吗?在这种情况下,如果 JSON 是一个太胖的协议,为什么不选择一个不那么胖的不同有线协议呢?我的意思是,我理解使用像 JSON 这样的标准的吸引力,但是如果您担心带宽,那么您可能应该选择一个不全是文本的有线协议。
【讨论】:
让webserver压缩,浏览器原生解压; gzip 或放气。
【讨论】:
我认为有两个问题会影响你的回答:
1) 在不知道程序的任何特定运行会发生什么的情况下,您能在多大程度上预测数据的组成?例如,如果您的数据包如下所示:
{
"vector": {
"latitude": 16,
"longitude": 18,
"altitude": 20
},
"vector": {
"latitude": -8,
"longitude": 13,
"altitude": -5
},
[... et cetera ...]
}
-- 那么您可能会通过创建一个硬编码的文本字符串字典来获得最佳压缩,这些文本字符串会不断出现在您的数据中,并用适当的字典索引替换每个文本字符串的出现。 (实际上,如果您的数据是 this 常规数据,您可能希望通过网络发送 just 值,然后只需将函数写入客户端以构造 JSON 对象如果需要 JSON 对象,则从值中获取。)
如果你无法预测哪些 headers会被使用,你可能需要使用LZW,或者LZ77,或者其他查看已经经过的数据的方法来找到它可以表达的数据以特别紧凑的形式。不过……
2) 数据包是否需要彼此分开压缩?如果是这样,那么 LZW 绝对是不是您想要的方法;它将没有时间将其字典构建到在单个数据包结束时会产生大量压缩结果的大小。恕我直言,在这种情况下获得真正大幅压缩的唯一机会是使用硬编码字典。
(以上所有内容的附录:正如 Michael Kohne 指出的那样,发送 JSON 意味着您可能正在发送所有文本,这意味着您未充分利用能够发送比您更广泛的字符范围的带宽' 正在使用。但是,如何将 0-127 范围内的字符打包到包含 0-255 值的容器中的问题相当简单,我认为可以作为“读者练习”,正如他们所说.)
【讨论】:
Gzip(deflate 算法)在压缩方面非常出色,尽管与所有优秀的压缩算法一样,它使用大量 cpu(在我的测试中是 json 读取/写入开销的 3-5 倍)。
【讨论】:
还有两种 JSON 压缩算法:CJson & HPack HPack 做得非常好,可以与 gzip 压缩相媲美。
【讨论】:
这里是对 JSON 数据可压缩性的简短测试 原文:crime-data_geojson.json 72844By (您可以在此处获取文件:https://github.com/lsauer/Data-Hub。该文件是随机挑选的,但不能代表平均 JSON 数据)
除了 zip,所有归档器参数都设置为 ultra
* cm/ nanozip:
> 4076/72844
[1] 0.05595519
* gzip:
> 6611/72844
[1] 0.09075559
* LZMA / 7zip
> 5864/72844
[1] 0.0805008
* Huffman / zip:
> 7382/72844
[1] 0.1013398
* ?/Arc:
> 4739/72844
[1] 0.06505683
这意味着压缩非常高且有益。 JSON 数据通常具有高熵。根据维基百科
英文文本的熵率在 1.0 到 1.5 bits per 字母,[1] 或低至每个字母 0.6 到 1.3 位,根据 Shannon 基于人体实验的估计
JSON 数据的熵通常远高于此值。 (在使用 10 个大小大致相等的任意 JSON 文件的实验中,我计算出 2.36)
【讨论】:
我发现压缩算法往往比选择替代格式更有效。如果这是“实时”压缩,我建议研究较低级别的 Brotli 或 Zstandard 压缩器(高级压缩器占用大量 CPU - 但确实提供了非常好的压缩)。
如果您想了解所有替代方案以及我是如何得出这个结论的,可以在on the Lucidchart techblog 找到完整的详细信息。
【讨论】: