2013-06-08 3 views
0

Прошло некоторое время с тех пор, как я в последний раз смотрел (например, устаревший nws package), и поэтому я задавался вопросом, произошло ли что-нибудь «за».Общая память для параллельных процессов

Есть ли способ обмена памятью через параллельные процессы?

Я хочу, чтобы каждый процесс имел доступ к объекту , который играет роль метаобъекта.

ответ

2

rredis package обеспечивает функциональность, похожую на nws. Вы можете использовать rredis с пакетами foreach и doRedis или с любым другим пакетом параллельного программирования, например parallel.

+0

Спасибо Стив! Слышал об этом один или два раза, но никогда не изучал этот пакет - до сих пор ;-) – Rappster

+0

Хотя значения Redis ограничены 512 МБ вправо? Это может быть потенциальным ограничением ... Существует также Rdsm, который использует bigmemory в качестве backend для обмена памятью, хотя это поддерживается только Linux и Mac, а не Windows ... –

1

Что будет эффективно работать, это общая матрица через пакет bigmemory. Вы можете сериализовать/unserialize довольно каждый объект R в такую ​​матрицу.

К сожалению, единственный способ, которым вы можете разделить матрицы между процессами, - это их дескрипторы, которые не являются детерминированными (т. Е. Если вы не общаетесь с другим процессом, вы не можете получить дескриптор). Чтобы решить эту проблему с курицей и яйцом, вы можете сохранить дескриптор в выбранном месте в файловой системе. (Дескриптор действительно маленький, единственная нетривиальная вещь, которую он содержит, - это адрес памяти фактического bigmatrx).

Если вы все еще заинтересованы, я могу опубликовать код R.

+0

Спасибо, это звучит круто! Хотелось бы увидеть некоторый код на этом :-) – Rappster

+0

@Rappster Я делаю правильный R-пакет для этого. Дайте мне несколько дней (надеюсь ...) –

+0

Awesome !! Я буду с нетерпением ждем этого – Rappster

1

Вы можете сделать это эффективно с помощью нового пакета yaplr.

Сначала установите его

devtools::install_github('adamryczkowski/yaplr') 

R номер сеанса 1:

library(yaplr) 
send_object(obj=1:10, tag='myobject') 
# Server process spawned 

R сессия № 2:

library(yaplr) 
list_objects() 
#   size     ctime 
# myobject 62 Sat Sep 24 13:01:57 2016 
retrieve_object(tag='myobject') 
# [1] 1 2 3 4 5 6 7 8 9 10 
remove_object('myobject') 
quit_server() 

Пакет использует bigmemory::big.matrix для эффективной передачи данных: при копировании большой объект между процессами R не производит ненужных копий: только одна сериализация и одна несериализация.

Не используются сетевые сокеты.

+0

Очень приятно, я проверю! – Rappster

+0

Наткнуться на зависимость от 'синхронности': нет доступных двоичных файлов Windows: -/ – Rappster

+0

@Rappster True ... Я отправлю автору вопрос. Между тем, возможно, я должен сам реализовать мьютексы - (автор не очень реагировал на мои предыдущие проблемы). Но это займет несколько недель. –

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