Общая память между изолятами с использованием IndexedDB

Я работаю с изолятами прямо сейчас и хотел бы знать, является ли использование IndexedDB для обмена данными между изолятами хорошим способом общения? В частности, я хочу, чтобы один изолят мог писать в него, а затем сообщал другим изолятам, что они могут только читать его. Это данные, которые будут считаться неизменными после того, как они будут записаны и будут достаточно большими. Основная причина, по которой я хочу это сделать, заключается в том, что я не хочу отправлять карту размером 6 МБ в 3 разных изолята, поскольку это немного интенсивно для программы.


person Austin Salgat    schedule 15.02.2014    source источник


Ответы (2)


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

Таким образом, вы можете попробовать сохранить свою структуру данных в буфере массива, чтобы воспользоваться этим.

См. эту статью mdn и html5rocks.

Поэтому для Dart храните свои данные в ByteData и то при компиляции через dartjs это надо не копировать, а передавать.

Примечание: Mozilla также проводит некоторые эксперименты с общим изменяемым доступом к буферам массива для нескольких веб-воркеров. Это позволяет emscripten компилировать многопоточный код c в javascript. Такой общий доступ, скорее всего, займет некоторое время, прежде чем он будет стандартизирован и широко внедрен.

person Greg Lowe    schedule 16.02.2014
comment
Я еще не изучал это, но если ссылка потеряна, я не могу отправить одни и те же данные нескольким веб-работникам, не делая копии? - person Austin Salgat; 17.02.2014
comment
Правильный. Невозможно одновременно использовать данные в нескольких веб-воркерах без их копирования. Разве асинхронный indexedb API, доступный для рабочих, в основном просто передача сообщений с данными, хранящимися в одном потоке/изолированном/рабочем, в любом случае, не уверен, почему вы видите indexedb как обходной путь для этого, поскольку он будет иметь те же ограничения, насколько я вижу. - person Greg Lowe; 17.02.2014
comment
Я надеялся, что транзакции readOnly приведут к отправке одной ссылки тому, кто запросил данные. - person Austin Salgat; 17.02.2014

Если вы все равно хотите хранить данные в IndexedDB, это нормально. Если вы делаете это только для оптимизации общения, я не думаю, что это лучше, чем отправка напрямую. Сериализация/десериализация обычно является наиболее интенсивной частью ЦП. Использование IndexedDB дополнительно записывает один раз и читает три раза на/с медленного диска.

person Günter Zöchbauer    schedule 15.02.2014
comment
Вы не думаете, что для повышения производительности будет использоваться кэширование? Мое главное замечание заключается в том, что просто отправка между веб-воркерами означает, что программа должна выполнить глубокую копию огромного куска данных (карта 6 МБ в моем случае) перед отправкой в ​​каждый поток, а не просто читать из одной и той же кэшированной ссылки. - person Austin Salgat; 15.02.2014
comment
Не думал об этом. Я бы сравнил его, чтобы увидеть, что работает лучше. - person Günter Zöchbauer; 15.02.2014