Преобразование массивов Javascript 2d в ArrayBuffer
Я пытаюсь использовать Web Workers для обработки больших объемов данных, и при передаче данных обратно в основной поток для отображения я хотел бы использовать переносимый объект, чтобы уменьшить влияние на поток пользовательского интерфейса.
Процедура в настоящее время приводит к многомерному массиву, который также может содержать объекты. Например:
[{foo: [{bar: "Alice",
car: 23,
dab: [2, 3, 5]}],
faa: [{moo: {a: [2,3], b: [4,5]} },
{moo: {a: [6,7], b: [8,9]} }]},
{foo: [{bar: "John",
car: 33,
dab: [6, 7, 1]}],
faa: [{moo: {a: [5,5], b: [9,2]} },
{moo: {a: [7,7], b: [4,2]} }]},
...]
Я видел этот пост преобразования строк, но опять же, я не вижу, как напрямую применить это к моей структуре массива: преобразование между строками и ArrayBuffers
Ценю помощь!
1 ответ
Многие люди имеют проблемы с пониманием этого. Итак, позвольте мне дать вам представление о ваших опциях и о том, что они делают:
(а) Использование простого postMessage
с вашими данными
var object = { ... };
worker.postMessage(object);
- [Основной поток] Создает объект структурированного клона
- [Основной поток] Рекурсивно копирует данные из
object
структурированному клону - [Основной поток] Публикует объект в [Рабочий]
- [Рабочий] Создать новый объект из структурированного клона.
- [Рабочий] Отправка нового сообщения с объектом в качестве параметра
Обратите внимание, что создание и анализ структурированного клона выполняется оптимизированным собственным кодом.
(б) Преобразование данных в передаваемые
var object = { ... };
var binary = CreateTypedArrayFromObject(object);
worker.postMessage(binary.buffer, [binary.buffer]);
- [Основной поток] Запускает медленный код JavaScript для преобразования
object
вTypedArray
- [Основной поток], который включает в себя либо сначала вычисление размера объекта, либо создание множества типизированных массивов и их конкатенацию
- [Основная тема] Перемещает
ArrayBuffer
изTypedArray
[Работнику] - [Рабочий] Получить
ArrayBuffer
- [Рабочий] Отправка нового сообщения с объектом в качестве параметра
- [Работник] Выполнить код JavaScript для создания нового объекта, отбрасывая полученный буфер массива
Я хочу отметить, что вы хотели избежать копирования, но вы все еще делаете копию, только на этот раз это не нативная копия, а копия javascript. Если вы хотите оптимизировать, вы должны спроектировать структуру данных так, чтобы она работала с типизированными массивами. Если это не так, просто даже не пытайтесь их использовать - вы просто добавите дополнительные издержки к своему коду.