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)
}
}
我的问题是
- 如果数组大小达到 2GB,它会存储在内存中吗?这意味着我将无法用大于可用内存的数据填充该数组?
- 当我从该数组创建一个 blob 时,该 blob 是否还会占用另外 2GB
来自记忆?
这取决于...
理论上,是的,每个 ArrayBuffer 将在内存中占用其 byteLength
,是的,由其创建的 Blob 将在内存中占用 new space。
然而浏览器可能会在这里使用一些优化,例如 IIRC Chrome 确实将其 Blob 保存在用户的磁盘上而不是膨胀内存,我相信他们可以对 ArrayBuffers 使用类似的技巧。
因此,在可能的情况下,可能最好为每个较小的块构建一个 Blob(因为每个“块”Blob 都将保存在磁盘上),但这是非常不确定的依赖于强大的假设。如果您需要安全,最好假设它会在内存中并且您有达到限制的风险。
如果你真的需要处理大文件,你可以考虑 Streams,例如新的 File System Access API 允许我们以流的形式写入磁盘。在无法访问的系统上,您可以尝试将每个块保存在 IndexedDB 中。
我正在获取 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)
}
}
我的问题是
- 如果数组大小达到 2GB,它会存储在内存中吗?这意味着我将无法用大于可用内存的数据填充该数组?
- 当我从该数组创建一个 blob 时,该 blob 是否还会占用另外 2GB 来自记忆?
这取决于...
理论上,是的,每个 ArrayBuffer 将在内存中占用其 byteLength
,是的,由其创建的 Blob 将在内存中占用 new space。
然而浏览器可能会在这里使用一些优化,例如 IIRC Chrome 确实将其 Blob 保存在用户的磁盘上而不是膨胀内存,我相信他们可以对 ArrayBuffers 使用类似的技巧。
因此,在可能的情况下,可能最好为每个较小的块构建一个 Blob(因为每个“块”Blob 都将保存在磁盘上),但这是非常不确定的依赖于强大的假设。如果您需要安全,最好假设它会在内存中并且您有达到限制的风险。
如果你真的需要处理大文件,你可以考虑 Streams,例如新的 File System Access API 允许我们以流的形式写入磁盘。在无法访问的系统上,您可以尝试将每个块保存在 IndexedDB 中。