Как я могу сделать действительно длинную строку, используя IndexedDB, не разбивая браузер?
Я пишу веб-приложение, которое генерирует потенциально большой текстовый файл, который пользователь будет загружать, и вся обработка выполняется в браузере. Пока что я могу читать файлы размером более 1 ГБ небольшими порциями, обрабатывать каждый порции, постепенно генерировать большой выходной файл и сохранять растущий вывод в IndexedDB. Моя более наивная попытка сохранить все результаты в памяти и затем сериализовать их в файл в самом конце приводила к сбою всех браузеров.
У меня вопрос двоякий:
Могу ли я добавить запись в IndexedDB (либо строку, либо массив), не считывая сначала все это в память? Прямо сейчас это:
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);
};
вызывает сбои после того, как вывод начинает становиться большим. Я мог бы просто записать несколько небольших записей в базу данных, но потом мне все равно пришлось бы потом прочитать их все в память, чтобы объединить их. Смотрите часть 2 моего вопроса ...
Могу ли я создать URL-адрес объекта данных для ссылки на значение в IndexedDB без загрузки этого значения в память? Для небольших строк я могу сделать:
var url = window.URL.createObjectURL(new Blob([myString]), {type: 'text/plain'});
Но для больших струн это не слишком хорошо. На самом деле, он падает до загрузки строки. Кажется, что большие чтения с использованиемget()
из IndexedDB, по крайней мере, происходит сбой Chrome (даже сбой инструментов разработчика).
Было бы быстрее, если бы я использовал Blobs вместо строк? Это преобразование дешево?
По сути, мне нужен способ, с помощью JavaScript, записать действительно большой файл на диск, не загружая все это в память в любой момент. Я знаю, что вы можете датьcreateObjectURL
Файл, но это не работает в моем случае, так как я генерируюновый файл из одного, который предоставляет пользователь.