Obtengo fragmentos de datos de ArrayBuffer y agrego cada fragmento a una matriz en un web worker y, cuando obtengo todos los fragmentos, convierto ese conjunto de fragmentos en un 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) } }MIS PREGUNTAS SON
Eso depende...
Teóricamente, sí, cada ArrayBuffer ocupará su byteLength en la memoria, y sí, los blobs creados a partir de él ocuparán un nuevo espacio en la memoria.
Sin embargo, los navegadores pueden usar algunas optimizaciones aquí, por ejemplo IIRC Chrome guarda sus Blobs en el disco del usuario en lugar de inflar la memoria, y creo que podrían usar trucos similares para ArrayBuffers.
Entonces, cuando sea posible, puede ser preferible crear un Blob por fragmento más pequeño (ya que cada Blob "fragmento" se guardaría en el disco), pero eso es bastante inseguro y se basa en suposiciones sólidas. Si necesita estar seguro, mejor asuma que estará en la memoria y que corre el riesgo de alcanzar un límite.
Si realmente necesita manejar archivos grandes, puede considerar Streams, por ejemplo, la nueva API de acceso al sistema de archivos nos permite escribir en el disco como flujos. En los sistemas en los que no se puede acceder a esto, puede intentar guardar cada fragmento en IndexedDB.