我正在使用nodejs中的一些数据,我需要以二进制格式进行编码。在内部我使用nodejs Buffers,但是当我序列化数据时,最好使用哪种编码?我目前正在使用'二进制文件'编码,但在文档中标记为已弃用,有更好的选择吗?我希望在我的代表中尽可能使用一点空间。
答案 0 :(得分:0)
为了彻底解决这个问题,我使用我的数据进行了一些测试。我的数据包含一组4096个元素编号数组。我使用了两种设置尺寸,一种是100个阵列,另一种是5000个阵列。这些序列化为redis缓存作为列表,redis列表的每个元素作为单个序列化数组。然后使用debug object
读取用于列表的密钥redis的大小并检查serializedLength
属性。结果总结在下表中
100个样本
编码 尺寸(字节)
base64 4,177,241
二进制4,162,398
十六进制4,669,965
JSON 2,271,670
utf16le * 4,543,605
utf8 * 3,640,132
ascii * 2,929,850
5000个样本
编码 尺寸(字节)
base64 213,317,603
二进制213,433,150
hex 238,609,493
JSON 115,733,172
utf16le * 232,032,313
utf8 * 185,279,730
ascii * 149,860,001
*文本编码是为了完整性而提供的,不应用于实际数据
O(n*d)
,其中n
是元素数,d
是数据样本数。但是,JSON案例的内存消耗应为O(c*d)
,其中c
是数字中的平均位数。 binary
编码对100个样本集进行节拍base64
编码,但不对5000样本集进行编码utf16le
,utf8
,ascii
,均标有*)不应用于实际数据,并且为了完整起见而包含在内。 utf8
在反序列化过程中实际崩溃,ascii
已知剥离任何值的高位[1] serializedLength
)可能是密钥[2]实际大小的不良指标。但是,由于我们所关心的是不同编码的大小之间的关系,因此这些结果仍然有用。 希望有人会发现这些信息很有用,我将为我的项目切换到JSON。这看起来有点奇怪,但数字并不存在。