2015-02-19 2 views
2

У меня есть большой объект Mutable Map, который занимает столько памяти, что все дочерние элементы родителя должны получать или изменять значения на одну и ту же карту.Совместное использование Mutable Map через akka actor children

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

Я просто хотел подтвердить, что SCALA фактически передает ссылку на объект вокруг, и поэтому Mutable Map не будет копироваться снова, вместо этого все дети будут изменять один и тот же экземпляр карты?

+2

Я не эксперт в этом каким-либо образом, но может быть хорошей идеей обернуть изменчивую карту в актера? – acjay

+0

Альтернатива: вы можете взглянуть на [akka STM] (http://nbronson.github.io/scala-stm/quick_start.html) и посмотреть, подходит ли это вашему прецеденту. В нем говорится: «Мы создадим двунаправленный список [mutable], который можно безопасно использовать несколькими потоками или участниками ... есть также транзакционные коллекции (например, TMap и TSet), которые являются заменами для коллекций из' scala.collection .mutable' "_ – mucaho

+0

Как вы можете узнать, скопирован ли объект или нет: отлаживайте программу, записывая значение' hashCode() 'карты в каждом акторе. Если значения одинаковые, то с 99.9 *% тот же объект. Если они отличаются, карта копируется. – mucaho

ответ

3

Это плохая идея. Команда Akka не рекомендует shared mutable state любого вида.

Способом Akka для решения вашей проблемы было бы сделать вашу карту неизменной и передать ее вашим детям в неизменяемых сообщениях. Если вы убеждены в том, что карта должна быть изменчивой, тогда один актер управляет картой, а другие участники отправляют ей сообщения для получения/обновления значений. Нет ничего плохого в изменчивом состоянии внутри одного актера.

0

У меня есть большой изменяемый объект Map, который занимает так много памяти, которая все дети родителей, необходимо получить доступ или изменять значения в же карте

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

Значит, вам необходимо передать ActorRef любому актеру, которому необходимо изменить карту. Самое приятное, что другой актер может быть на другой JVM, и он все равно будет работать.

Это также заботит ваше внимание на большой объем памяти вашей Карты.

+0

Спасибо всем за ваши ответы. Я закончил использование подхода просто передать объект любому актеру, который запрашивает его с помощью сообщений. –

+0

передать объект Mutable Map в сообщении вашему аккорду Akka? –

+0

Я имею в виду, что мы выяснили, что нам даже не нужна карта. Мы просто передали объект, который является последовательностью и больше не является картой для всех дочерних субъектов по запросу, посредством которой все участники имеют только одну копию. –

Смежные вопросы