【问题标题】:JSON increases Float32Array buffer size many folds when sending through websocketJSON 在通过 websocket 发送时将 Float32Array 缓冲区大小增加了许多倍
【发布时间】:2013-05-08 22:32:23
【问题描述】:

我有一个奇怪的经历。当我发送此数组缓冲区设置的数据时:

var f32s = Float32Array(2048);
for (var i = 0; i < f32s.length; i++) {
    f32s[i] = buffer[i]; // fill the array
    ws.send(f32s[i]);
}

我在另一端得到的缓冲区大小是 8192 字节。 但是当我以 JSON 格式发送大块缓冲区时,如下所示:

var obj = {
    buffer_id: 4,
    data: f32s[i]
};
var json = JSON.stringify({ type:'buffer', data: obj });            
ws.send(json);

我在另一端得到的缓冲区大小膨胀到 55,xxx 字节(已填充数据)和 17,xxx 字节(未填充数据)。

为什么会发生这种情况,如何保持缓冲区较小? 我想这样做是因为当我在另一端渲染它时,流是断断续续的。

谢谢。

【问题讨论】:

    标签: javascript arrays websocket arraybuffer typedarray


    【解决方案1】:

    我预计会发生这种情况,因为浮点 32 数组在数据结构中每个数字需要 32 位,但是作为 ascii 格式的 json 表示每个数字都有一个严重的 8 位字符,然后是另一个 8 位的逗号,也许再次用于小数,再次用于分隔空格。

    因此,例如数据[0.1234545, 111.3242, 523.12341] 需要 3 * 32 => 96 位才能在 float32array 中表示,但作为 json 字符串,此示例中的 32 个字符中的每一个都需要 8 位,即 256 位。

    【讨论】:

    • 虽然我不太明白,但可以想象。无论如何压缩 Float32Array 而不会丢失数据?
    • 无论您做什么,Float32Array 每个项目都将使用 4 个字节。但是,您可以通过在服务器上启用 gzip 压缩来有效地压缩数据以进行传输。
    猜你喜欢
    • 2014-12-20
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    相关资源
    最近更新 更多