У меня есть приложение, полностью основанное на браузере (т.е. без бэкэнда), которое анализирует XML-данные в файлах, каждый из которых в среднем составляет около 250 МБ. Фактический синтаксический анализ и синтаксический анализ происходят в веб-воркере, который получает данные порциями по 64 КБ от экземпляра FileReader
, и все это довольно производительно.
У меня есть запрос от клиента на расширение этого приложения, чтобы оно могло создавать ZIP-файл, содержащий исходный входной файл и результаты анализа, и позволять пользователю сохранять этот файл на своем локальном компьютере. Создать в памяти ZIP-файл с этим содержимым не проблема. Проблема заключается в передаче большого количества данных из веб-работника, который их генерирует, обратно в основной поток браузера, чтобы их можно было сохранить; попытка сделать это неизменно вызывает сбой или исключение нехватки памяти. (Я пробовал передавать строки сразу и по частям, а также пытался использовать ArrayBuffer
в качестве передаваемого объекта, чтобы избежать копирования. Все терпят неудачу одинаково.)
К сожалению, я не знаю способа вызвать операцию сохранения файла непосредственно из рабочего потока. Я знаю несколько способов сделать это из основного потока браузера, но все они требуют либо возможности создавать узлы DOM (что, конечно же, не могут сделать рабочие потоки), либо использования интерфейсов (например, msSaveBlob, saveAs), которые не браузер, кажется, подвергает рабочему потоку. Я потратил некоторое время на поиск возможностей в Интернете, но не нашел ничего полезного; FileWriterSync
выглядит неплохо, но его поддерживает только Chrome, а мне нужно ориентироваться также на IE и Firefox.
Есть ли способ, который я упустил из виду, для сохранения файлов непосредственно из веб-воркера? Если так, то, что это? Или мне просто не повезло здесь?