【问题标题】:Which binary encoding to use for a node buffer?哪个二进制编码用于节点缓冲区?
【发布时间】:2014-11-03 16:14:51
【问题描述】:

我正在处理需要以二进制格式编码的 nodejs 中的一些数据。在内部,我为此使用 nodejs 缓冲区,但是当我序列化数据时,最好使用哪种编码?我目前正在使用“二进制”编码,但这在文档中被标记为已弃用,有更好的选择吗?我希望在我的表现中尽可能地使用一点空间。

【问题讨论】:

  • 解释一下序列化二进制数据是什么意思。如果您需要在基于文本的协议中传输数据,该协议中使用什么编码?您想在 JSON 中包含缓冲区吗?如果你“序列化”到磁盘只是fs.writeFileBuffer
  • 我正在序列化到一个 redis 数据库,它只能处理字符串,尽管它们是“二进制安全的”
  • 是的,我读过。我的问题是问什么是最节省空间的编码。我应该从你的回答中假设它是 64 基数

标签: node.js binary buffer


【解决方案1】:

为了得到一个彻底的答案,我使用我的数据进行了一些测试。我的数据由一组 4096 个元素编号数组组成。我使用了两种尺寸,一种有 100 个数组,另一种有 5000 个数组。这些被序列化到 redis 缓存作为列表,redis 列表的每个元素作为单个序列化数组。然后使用debug object 并检查serializedLength 属性读取redis 用于列表的键的大小。结果总结在下表中

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
十六进制                    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 编码优于 base64 在 100 个样本集而非 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    相关资源
    最近更新 更多