¿Cómo puedo hacer una cadena realmente larga usando IndexedDB sin bloquear el navegador?

Estoy escribiendo una aplicación web que genera un archivo de texto potencialmente grande que el usuario descargará, y todo el procesamiento se realiza en el navegador. Hasta ahora, puedo leer un archivo de más de 1 GB en pequeños fragmentos, procesar cada fragmento, generar un archivo de salida grande de forma incremental y almacenar la salida creciente en IndexedDB. Mi intento más ingenuo que mantuvo todos los resultados en la memoria y luego los serializó en un archivo al final estaba haciendo que todos los navegadores se bloqueen.

Mi pregunta es doble:

¿Puedo agregar una entrada en IndexedDB (ya sea una cadena o una matriz) sin leer primero todo en la memoria? En este momento, esto:

task.dbInputWriteQueue.push(output);
var transaction = db.transaction("files", "readwrite");
var objectStore = transaction.objectStore("files");
var request = objectStore.get(file.id);
request.onsuccess = function()
{
    request.results += nextPartOfOutput
    objectStore.put(request.results);
};

está causando bloqueos después de que la salida comienza a crecer. Podría escribir un montón de pequeñas entradas en la base de datos, pero luego tendría que leerlas todas en la memoria más tarde para concatenarlas. Ver la parte 2 de mi pregunta ...

¿Puedo hacer una URL de objeto de datos para hacer referencia a un valor en IndexedDB sin cargar ese valor en la memoria? Para pequeñas cadenas que puedo hacer:

var url = window.URL.createObjectURL(new Blob([myString]), {type: 'text/plain'});

Pero para cadenas grandes esto no funciona demasiado bien. De hecho, se bloquea antes de cargar la cadena. Parece que las grandes lecturas usanget() de IndexedDB hace que Chrome, al menos, se bloquee (incluso las herramientas del desarrollador se bloquean).

¿Sería más rápido si estuviera usando Blobs en lugar de cadenas? ¿Esa conversión es barata?

Básicamente, necesito una forma, con JavaScript, de escribir un archivo realmente grande en el disco sin cargar todo en la memoria en ningún momento. Sé que puedes darcreateObjectURL un archivo, pero eso no funciona en mi caso ya que estoy generando unnuevo archivo de uno que proporciona el usuario.

Respuestas a la pregunta(2)

Su respuesta a la pregunta