JSON和Gzip是一种序列化数据的简单方法。它们在编程语言中广泛实现。此表示也可跨系统移植(是吗?)。
我的问题是,与非常有效的二进制序列化方法相比,json + gzip是否足够好(成本低于2倍)?在序列化各种数据时,我正在寻找空间和时间成本。
答案 0 :(得分:4)
使用json + gzip进行序列化比使用rawbytes + gzip多25%的空间用于数字和对象。对于有限精度数(4位有效数字),序列化大小相同。
来源:https://github.com/csiz/gzip-json-performance
我选择了1e6个浮点(64位)数字。我假设这些数字来自某些自然源,因此我使用指数分布并将它们四舍五入为4位有效数字。因为JSON写下了整个表示,我认为存储大量数据可能会产生更大的成本(123456.000000,而不是0.123456)所以我检查了两种情况。还有一组未被舍入的数字。
压缩的json与二进制的小数字(大约1.0):
json 3.29mb json/raw 43%
binary 3.03mb binary/raw 40%
json/binary 1.09
压缩的json与二进制的大数字(大约1000000):
json 2.58mb json/raw 34%
binary 3.10mb binary/raw 41%
json/binary 0.83
压缩的json vs binary用于完全精度的双精度:
json 8.90mb json/raw 117%
binary 7.27mb binary/raw 95%
json/binary 1.22
对于对象,我在JSON中将它们序列化为通常的懒惰方式:
[
{
"small number": 0.1234,
"large number": 1234000,
"choice": "two"
},
...
]
对于有效的二进制表示,我对对象进行了矢量化:
n = 1e6
small number = binary([0.1234, ...])
large number = binary([1234000, ...])
choice = binary([2, ...]) # indexes to the enum ["zero", "one", ..., "four"]
压缩的json vs二进制对象:
json 8.36mb json/raw 44%
binary 6.59mb binary/raw 35%
json/binary 1.27