Используйте веб-работника для строкового преобразования - PullRequest
0 голосов
/ 24 марта 2020

Итак, у меня есть приложение, которому необходимо JSON.stringify своих данных для помещения в localStorage, но по мере увеличения данных эта операция становится невероятно дорогой.

Итак, я попытался переместить это на webWorker, чтобы он не входил в основной поток, но сейчас я учусь размещать объект на webWorker даже дороже, чем его написание.

Так что я думаю, я спрашиваю, есть ли способ получить JSON.stringify из основного потока или, по крайней мере, сделать его дешевле?

Я знаком с fast-json-stringify, но не думаю, что смогу каждый раз предоставить полную схему ...

1 Ответ

1 голос
/ 25 марта 2020

Вы правильно заметили, что передача объекта веб-работнику стоит столько же, сколько и его сериализация. Это связано с тем, что веб-работникам также необходимо получать сериализованные данные, а не нативные JS объекты, поскольку объекты экземпляра привязаны к потоку JS, в котором они были созданы.

Применимо универсальное решение c ко многим проблемам программирования: выбрал правильные структуры данных при работе с большими наборами данных . Когда данные становятся больше, лучше жертвовать простотой доступа к производительности. Таким образом, выполните любое из следующих действий:

Храните данные в indexedDB

Если ваш большой объект содержит списки записей одного типа, используйте индексированную БД для чтения и записи, и вам не нужно беспокоиться о сериализация вообще. Это потребует рефакторинга вашего кода, но это правильное решение для больших наборов данных.

Хранение данных в ArrayBuffer

Если ваши данные в основном имеют значения фиксированного размера, используйте ArrayBuffer. ArrayBuffer можно скопировать или перенести на веб-работника практически мгновенно, и если ваши записи имеют одинаковый размер, сериализация может выполняться параллельно. Для доступа вы можете написать простые классы-обертки, которые преобразуют ваши двоичные данные во что-то более удобочитаемое.

...