Есть ли способ передать массив объектов веб-работнику как переносимый объект?

Я работаю над проектом с интенсивным использованием ЦП и памяти, для которого часть обработки отправляется веб-работнику, чтобы не повесить браузер во время его обработки. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно отправить экземпляру веб-работника несколько многомерных массивов, но после профилирования приложения я понял, что оно клонирует массивы, поэтому я попытаюсь проверить, передам ли я их как переносимые объекты.

Для простоты предположим, что я пытаюсь передать массивы:

var myArray1 = [{a: 0, b: "0"}, {a: 1, b: "0"}];

var myArray2 = [{c: 0, d: "0"}, {c: 1, d: "0"}];

Есть ли способ передать их как переносимые объекты в экземпляр веб-работника?

1 ответ

Решение

Не напрямую но ArrayBuffers а также SharedArrayBuffers могут быть переданы веб-работникам, и если ваши данные будут такими же единообразными, как в вашем примере, то можно будет хранить эти данные в буфере массива, а не в массиве объектов.

Вместо

const arr = [{ a: 0, b: '0' }];

вы можете хранить данные как

const ab = new ArrayBuffer(2 * 4);
const dv = new DataView(ab);
dv.setFloat32(0, 0);
dv.setUint32(4, '0'.charCodeAt(0));

А затем прочитайте его обратно, также используя представление данных на рабочем месте. Это позволит вам передавать данные работнику, используя передаваемый элемент. Конечно, все зависит от ваших данных и от того, как они структурированы.

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