将Javascript 2d数组转换为ArrayBuffer

时间:2014-04-23 07:25:42

标签: javascript arrays web-worker arraybuffer

我正在尝试使用Web Workers处理大量数据,并且在将数据传递回主线程进行显示时,我想使用可传输对象来减少对UI线程的影响。

该过程当前导致多维数组也可以包含对象。例如:

[{foo: [{bar: "Alice",
         car: 23,
         dab: [2, 3, 5]}],
  faa: [{moo: {a: [2,3], b: [4,5]} },
        {moo: {a: [6,7], b: [8,9]} }]},
 {foo: [{bar: "John",
         car: 33,
         dab: [6, 7, 1]}],
  faa: [{moo: {a: [5,5], b: [9,2]} },
        {moo: {a: [7,7], b: [4,2]} }]},
 ...]

我看过这个字符串转换帖子,但是再一次,我看不出如何直接将它应用于我的数组结构: Converting between strings and ArrayBuffers

感谢帮助!

1 个答案:

答案 0 :(得分:1)

很多人都有理解这个问题。所以,让我给你一个你的选择和他们做的图像:

(a)对您的数据使用简单postMessage

var object = { ... };
worker.postMessage(object);
  1. [主要主题]创建structured clone对象
  2. [主要主题]以递归方式将数据从object复制到结构化克隆
  3. [主要主题]将对象发布到[Worker]
  4. [Worker]从结构化克隆创建新对象。
  5. [Worker]以对象作为参数
  6. 发送新消息

    请注意,创建和解析结构化克隆是通过优化的本机代码完成的。

    (b)将数据转换为可转让的

    var object = { ... };
    var binary = CreateTypedArrayFromObject(object);
    worker.postMessage(binary.buffer, [binary.buffer]);
    
    1. [主要主题]运行慢速javascript代码以将object转换为TypedArray
    2. [主要线程]涉及先计算对象大小,或者创建多个类型化数组并连接它们
    3. [主要主题]将ArrayBuffer的{​​{1}}移至[工作人员]
    4. [工作人员]收到TypedArray
    5. [Worker]以对象作为参数
    6. 发送新消息
    7. [Worker]运行javascript代码创建新对象,丢弃收到的数组缓冲区
    8. 我指出的是你想要避免复制,但你还在制作副本,只是这次它不是原生的,而是javascript副本。如果要进行优化,则必须设计数据结构,以便在类型化数组上运行。如果它没有,甚至不尝试使用它们 - 您只需为代码添加额外的开销。