【问题标题】:javascript: smallest JSON.stringify for Float32Array?javascript: Float32Array 的最小 JSON.stringify?
【发布时间】:2016-09-16 18:40:12
【问题描述】:

FireFox 46.0.1:我正在使用第 3 方 (easyrtc) 软件在对等方之间发送 15KB 的 Float32Arrays 块。 Easyrtc 坚持数据是 JSON-able。不幸的是,JSON.stringify 产生的字符串是原始数据的两倍多:16384 字节的数据变成了长度为 35755 的字符串。下面是我的测试代码,后面是控制台输出。如果我能做些什么来减少字符串化的大小怎么办?有没有办法只发送值(没有键)?我可以使用“replacer”参数只发送值吗?如果可以,我不需要在接收端的相应 JSON.parse 上使用替换器吗?

var g_testBufferNBytes = 4096 * 4;
var g_testBuffer = new ArrayBuffer(g_testBufferNBytes);
var g_testBufferView   = new Float32Array(g_testBuffer);
console.log("array byte length " + g_testBuffer.byteLength); 
console.log("view byte length " + g_testBufferView.byteLength);
var j = JSON.stringify(g_testBufferView);
console.log("j length " + j.length);
var newBuf = JSON.parse(j);
console.log("newBuf length " + Object.keys(newBuf).length);

控制台: 数组字节长度 16384 查看字节长度 16384 j 长度 35755 newBuf 长度 4096

【问题讨论】:

标签: javascript stringify


【解决方案1】:

是的

ES6:假设您的数据在 let f32 = g_testBufferView (array Float32Array) ) - 至少可以通过 4 种方式将其保存为 JSON 数组:

// code 
let f32json = JSON.stringify(f32);
let f32jsonArr = JSON.stringify(Array.from(f32));
let f32base64 = btoa(String.fromCharCode(...(new Uint8Array(f32.buffer))));
let f32base128 = ... // not trivial, look below


// decode
let df32json = new Float32Array(Object.values(JSON.parse(f32json))); 
let df32jsonArr = new Float32Array(JSON.parse(f32jsonArr));
let df32base64 = new Float32Array(new Uint8Array([...atob(f32base64)].map(c => c.charCodeAt(0))).buffer);
let df32base128 = ... // not trivial, look below

注意Object.values 返回按数字键排序的值(查看here)。

这里是working example。您也可以使用 base128 进行解码,但我在此示例中不使用(以免使其复杂化)-更多详细信息here

如果您的Float32Array-f32 有 4096 个元素等于0.3,那么:

  • f32 有 16384 个字节,
  • f32json(来自您的问题的j)有109483字节(比f32大6倍)
  • f32jsonArr 有 81921 个字节(比 f32 大 >5 倍)
  • f32base64 有 21848 字节(比 f32 大约 1.3 倍)
  • f32base128 有 18725 个字节(比 f32

如果您的Float32Array-f32 有 4096 个元素,等于从 1 到 9 的整数,那么:

  • f32 有 16384 个字节 - CONST
  • f32jsonj 来自您的问题)有 35755 个字节(比 f32 大 2 倍)
  • f32jsonArr 有 8193 个字节(这是 f32 的 2 倍 SMALLER(原文如此!))
  • f32base64 有 21848 个字节 - CONST(比 f32 大约 1.3 倍)
  • f32base128 有 18725 个字节 - CONST(比 f32

结论

f32base64 比输入数组大小大 33% 时得到的不依赖于数组值的最小结果(结果大小是恒定的)。对于f32base128 - 它包含有效的 JSON(字符串),它比输入大大约 look here - 在“更新”部分)。所以请使用f32base64 - 这可能是您无需更复杂的方法即可获得的最小 JSON。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 2015-08-15
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多