在将数据包发送到网络之前,选择什么样的压缩算法对于以JSON编码的数据包进行压缩最好?LZW是否适用于此类任务,还是有更好的选择?
在将数据包发送到网络之前,选择什么样的压缩算法对于以JSON编码的数据包进行压缩最好?LZW是否适用于此类任务,还是有更好的选择?
我认为有两个问题会影响你的答案:
1)在不知道程序每次运行会发生什么的情况下,你能多大程度地预测数据的组成?例如,如果你的数据包看起来像这样:
{
"vector": {
"latitude": 16,
"longitude": 18,
"altitude": 20
},
"vector": {
"latitude": -8,
"longitude": 13,
"altitude": -5
},
[... et cetera ...]
}
-- 那么您可能会通过创建一个硬编码的文本字符串字典来获得最佳压缩效果,并将每个文本字符串的出现替换为相应的字典索引。(实际上,如果数据有规律,您可能只需要通过网络发送值,并在客户端编写一个函数从这些值构造 JSON 对象,如果需要的话。)* 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
我发现压缩算法比选择其他格式更有效。如果这是“实时”压缩,我建议调查一下低级别的Brotli或Zstandard压缩器(高级别的需要大量CPU - 但确实提供非常好的压缩效果)。
如果您想阅读所有备选方案以及我是如何得出结论的,请查看Lucidchart技术博客的完整细节。
如果你正在实现在线压缩,那么你控制连接的两端,对吗?在这种情况下,如果JSON协议太大了,为什么不选择一个不那么大的不同的协议呢?我的意思是,我理解使用JSON这样的标准的吸引力,但如果你担心带宽问题,那么你可能应该选择一个不全是文本的线路协议。
让网络服务器使用 gzip 或 deflate 进行压缩,让浏览器进行本地解压缩。
Gzip(缩小算法)在压缩方面相当不错,虽然像所有优秀的压缩算法一样,会占用很多 CPU 资源(在我的测试中,比 JSON 读/写的开销多 3-5 倍)。