Javascript Web worker在传递具有数组缓冲区的大型对象数组时崩溃Chrome选项卡

Javascript Web worker在传递具有数组缓冲区的大型对象数组时崩溃Chrome选项卡,javascript,performance,crash,web-worker,Javascript,Performance,Crash,Web Worker,我有一个生成大量数据的应用程序。这些数据在可用之前需要进行处理(WebGL 3D应用程序)。因此,我创建了一个web worker来进行处理,以防止阻塞UI的其余部分 问题是,当数据足够大时,启动web worker的第一个调用就会导致Chrome中的选项卡崩溃并显示“Aw,Snap”消息。我在web worker的一开始就设置了断点,但它甚至没有进入web worker。它似乎在尝试克隆postMessage()调用的数据时崩溃 以下是一般数据结构(尝试将这些数据的数组传递给web worke

我有一个生成大量数据的应用程序。这些数据在可用之前需要进行处理(WebGL 3D应用程序)。因此,我创建了一个web worker来进行处理,以防止阻塞UI的其余部分

问题是,当数据足够大时,启动web worker的第一个调用就会导致Chrome中的选项卡崩溃并显示“Aw,Snap”消息。我在web worker的一开始就设置了断点,但它甚至没有进入web worker。它似乎在尝试克隆postMessage()调用的数据时崩溃

以下是一般数据结构(尝试将这些数据的数组传递给web worker):

问题在于阵列缓冲区1、2和3。我有一个由MyClass对象组成的数组,大约15000个,大约97%的数组缓冲区少于200个元素。但对于剩下的3%,数组缓冲区有1000到40000个元素

有趣的是,如果我注释掉任意两个数组缓冲区,则包含这些类的postMessage()将起作用

另一个有趣的地方是:如果我在Chrome中的开发工具中单击“启动时暂停”复选框,postMessage()有时也会工作,即使使用所有3个数组缓冲区。否则,每次都会失败

有人知道为什么会这样吗?我找不到关于我可能遇到的数据约束或其他奇怪的内部怪事的文档。否则,我会重构我的代码来解决这个问题

演示:我创建了一个JSFIDLE来演示这一点:


如果您将此小提琴中的数据最大大小更改为15000,请不要以这种方式保存,否则您将无法再访问该页面。

您是否尝试过使用所有权转移将数据传递给工作线程。这在传递大型数组缓冲区时特别有用,这将要求您使用一个额外参数
postMessage(ObjectToTransfer,[ObjectToTransfer.buffer,…])更改postMessage调用

这样,您可以克隆整个对象,但可以传输该对象中的数组缓冲区


签出

我的脚本也有类似的问题,我通过一个webworker传递一个多维数组,其中webworkers的任务是检查json文件的更新,如果有更新,则发送一条带有新数据的消息。遗憾的是,随着时间的推移,我出现了aw snap错误。我遇到了完全相同的问题,尽管我的脚本没有巨大的数组。相反,即使在谷歌地图上,我也在“拖动”中调用一个工作线程,它也在做完全相同的事情。我认为这是因为它“只是在用户拖来拖去时向工作线程发送新请求。”-\有同样的问题,但我很困惑为什么不是第一个?是的,我从来没有找到这个问题的答案。最终,我只是向工人传递了更少的数据。我只是想找到一种方法,因为我找不到任何指定传递给工人的数据限制/约束的信息。这在chrome 411上不再是问题了是的,我这样做了。但我还是遇到了问题。我们使用这个也有问题。
function MyClass(id) {
    var count32 = getSize();
    var count16 = count32 * 3;

    this.uint16    = new Uint16Array(count16);  // array buffer 1
    this.float32_a = new Float32Array(count32); // array buffer 2
    this.float32_b = new Float32Array(count32); // array buffer 3


    this.a = id;
    this.b = count32;
    this.c = new MyInnerClass();
    this.d = true;
    this.e = 6;
    this.f = {a: 1, b: 2, c: 3, d: 4};
    this.g = [];
}

function MyInnerClass() {
    this.a = -10;
    this.b = -20;
    this.c = -30;
    this.d =  10
    this.e =  20
    this.f =  30
}