我想将ArrayBuffer(简称100MB)转换为Blob,然后从Blob转换回ArrayBuffer而不复制数据。
FileReader / XMLHttpRequest会复制数据,还有其他方法吗?
var b = new Blob([new Uint8Array(someArrayBuffer)]);
PS:我想进行大型只读缓冲区的交叉表通信而不重复它,例如本地ArrayBuffer是500MB我想在多个标签中使用它而不重复数据。
答案 0 :(得分:1)
可能有一些方法可以在没有FileReader或XHR的情况下将Blob转换为ArrayBuffer,但无论如何它们都会复制数据。
但听起来你需要的不是从Blob转换为ArrayBuffer,而是跨标签共享你的ArrayBuffer或Blob。
为此,您有多种方式:
将ArrayBuffer / Blob存储在主页面上,并直接从子页面访问它,就像您可以访问任何其他全局变量一样:
["/usr/bin/g++", "-Wall"] + fileList + ["-lglut", "-lGLU", "-lGL", "-std=c+11", "-o", "test", 'main.cpp']
// in parent
window.myArrayBuffer = buffer;
如果您一次只需要在一个选项卡中访问ArrayBuffer,那么您可以使用// in child
var buf = window.opener.myArrayBuffer;
doSomethingWithBuffer(buf);
API将其缓冲区传输到其他页面。
postMessage
// in parent
child.postMessage(myArrayBuffer, 'origin', [myArrayBuffer]);
// here myArrayBuffer's buffer is *transferred* to child,
// it can't be accessed by parent anymore
如果您只需要在不同但来自同源窗口上显示Blob,请使用blobURI。它只会创建一个指向内存中数据的指针,并将这些数据从垃圾收集中锁定,直到你的文档死掉,但不会复制数据。
如果您不需要支持IE或Safari,您甚至可以考虑首先转移ArrayBuffer的SharedWorkers,并让所有标签让它执行计算,基于相同的数据。