哪个二进制编码用于节点缓冲区?

时间:2014-11-03 16:14:51

标签: node.js binary buffer

我正在使用nodejs中的一些数据,我需要以二进制格式进行编码。在内部我使用nodejs Buffers,但是当我序列化数据时,最好使用哪种编码?我目前正在使用'二进制文件'编码,但在文档中标记为已弃用,有更好的选择吗?我希望在我的代表中尽可能使用一点空间。

1 个答案:

答案 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
  
  *文本编码是为了完整性而提供的,不应用于实际数据

有关这些结果的一些注意事项:

  • JSON编码在两个测试中都获得了很大的优势,这对我来说很奇怪,因为它扩展了数据添加括号和引号。我很想知道原因。
  • 每种情况的内存消耗应为O(n*d),其中n是元素数,d是数据样本数。但是,JSON案例的内存消耗应为O(c*d),其中c是数字中的平均位数。
  • binary编码对100个样本集进行节拍base64编码,但不对5000样本集进行编码
  • 文字编码(utf16leutf8ascii,均标有*)不应用于实际数据,并且为了完整起见而包含在内。 utf8在反序列化过程中实际崩溃,ascii已知剥离任何值的高位[1]
  • 用于这些测试的字段(serializedLength)可能是密钥[2]实际大小的不良指标。但是,由于我们所关心的是不同编码的大小之间的关系,因此这些结果仍然有用。

希望有人会发现这些信息很有用,我将为我的项目切换到JSON。这看起来有点奇怪,但数字并不存在。

  1. http://nodejs.org/api/buffer.html#buffer_buffer
  2. https://groups.google.com/forum/#!msg/redis-db/JaI-paZ0xoA/0hVZSTb8iN8J