我有一个生成大量数据的应用程序。此数据需要在可用之前进行处理(WebGL 3D 应用程序)。所以我创建了一个 web worker 来进行处理,以防止阻塞 UI 的其余部分。
问题是当数据足够大时,第一次调用启动 web worker 会导致 Chrome 中的选项卡崩溃并显示“Aw, Snap”消息。我在 web worker 的一开始就设置了断点,它甚至没有进入 web worker。尝试克隆 postMessage() 调用的数据时,它似乎崩溃了。
这是一般数据结构(尝试将这些数组传递给网络工作者):
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
}
问题在于数组缓冲区 1、2 和 3。我有一个MyClass对象数组,大约有 15,000 个,大约 97% 的数组缓冲区的元素少于 200 个。但对于剩下的 3%,数组缓冲区有 1,000 到 40,000 个元素。
有趣的是,如果我注释掉任何 2 个数组缓冲区,则包含这些类的 postMessage() 将起作用。
另一个有趣的点:如果我在 Chrome 的开发工具中单击“启动时暂停”复选框,postMessage() 有时会起作用,即使所有 3 个数组缓冲区也是如此。否则,每次都会失败。
有谁知道为什么会这样?我找不到关于我可能遇到的数据限制或其他奇怪的内部怪异的文档。否则,我将最终重构我的代码来解决这个问题。
演示:我创建了一个 jsfiddle 来演示这一点:http: //jsfiddle.net/GmvyJ/11/
如果您更改此小提琴中的数据最大大小(更改为 15,000),请不要以这种方式保存,否则您将永远无法访问该页面。