Преобразование массивов 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);
  1. [Основной поток] Создает объект структурированного клона
  2. [Основной поток] Рекурсивно копирует данные из object структурированному клону
  3. [Основной поток] Публикует объект в [Рабочий]
  4. [Рабочий] Создать новый объект из структурированного клона.
  5. [Рабочий] Отправка нового сообщения с объектом в качестве параметра

Обратите внимание, что создание и анализ структурированного клона выполняется оптимизированным собственным кодом.

(б) Преобразование данных в передаваемые

var object = { ... };
var binary = CreateTypedArrayFromObject(object);
worker.postMessage(binary.buffer, [binary.buffer]);
  1. [Основной поток] Запускает медленный код JavaScript для преобразования object в TypedArray
  2. [Основной поток], который включает в себя либо сначала вычисление размера объекта, либо создание множества типизированных массивов и их конкатенацию
  3. [Основная тема] Перемещает ArrayBuffer из TypedArray [Работнику]
  4. [Рабочий] Получить ArrayBuffer
  5. [Рабочий] Отправка нового сообщения с объектом в качестве параметра
  6. [Работник] Выполнить код JavaScript для создания нового объекта, отбрасывая полученный буфер массива

Я хочу отметить, что вы хотели избежать копирования, но вы все еще делаете копию, только на этот раз это не нативная копия, а копия javascript. Если вы хотите оптимизировать, вы должны спроектировать структуру данных так, чтобы она работала с типизированными массивами. Если это не так, просто даже не пытайтесь их использовать - вы просто добавите дополнительные издержки к своему коду.

Другие вопросы по тегам