ArrayBuffer 和 Blob 对象的内存使用

Memory usage of ArrayBuffer and Blob objects

我正在获取 ArrayBuffer 数据块,我正在将每个块添加到 web worker 上的数组,当我获取所有块时,我将该块数组转换为 blob。

//worker.js

const array = []

this.onmessage = function(e){
     if(e.data.done)
     {
        const blob = new Blob(array);
        this.postMessage(blob)
        shunks.length = 0
     }
     else
     {
         array.push(e.data.chunk)
     }
}

我的问题是

  1. 如果数组大小达到 2GB,它会存储在内存中吗?这意味着我将无法用大于可用内存的数据填充该数组?
  2. 当我从该数组创建一个 blob 时,该 blob 是否还会占用另外 2GB 来自记忆?

这取决于...

理论上,是的,每个 ArrayBuffer 将在内存中占用其 byteLength,是的,由其创建的 Blob 将在内存中占用 new space。

然而浏览器可能会在这里使用一些优化,例如 IIRC Chrome 确实将其 Blob 保存在用户的磁盘上而不是膨胀内存,我相信他们可以对 ArrayBuffers 使用类似的技巧。

因此,在可能的情况下,可能最好为每个较小的块构建一个 Blob(因为每个“块”Blob 都将保存在磁盘上),但这是非常不确定的依赖于强大的假设。如果您需要安全,最好假设它会在内存中并且您有达到限制的风险。

如果你真的需要处理大文件,你可以考虑 Streams,例如新的 File System Access API 允许我们以流的形式写入磁盘。在无法访问的系统上,您可以尝试将每个块保存在 IndexedDB 中。