Есть ли способ передать массив объектов веб-работнику как переносимый объект?
Я работаю над проектом с интенсивным использованием ЦП и памяти, для которого часть обработки отправляется веб-работнику, чтобы не повесить браузер во время его обработки. Проблема, с которой я сталкиваюсь, заключается в том, что мне нужно отправить экземпляру веб-работника несколько многомерных массивов, но после профилирования приложения я понял, что оно клонирует массивы, поэтому я попытаюсь проверить, передам ли я их как переносимые объекты.
Для простоты предположим, что я пытаюсь передать массивы:
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));
А затем прочитайте его обратно, также используя представление данных на рабочем месте. Это позволит вам передавать данные работнику, используя передаваемый элемент. Конечно, все зависит от ваших данных и от того, как они структурированы.