2016-01-08 3 views
0

Я бы хотел использовать несколько процессоров при вычислении в R. До сих пор я пробовал подход . Я знаю, что он может вернуть нужные мне значения, однако мне интересно, могу ли я как-то изменить общие переменные напрямую.Как изменить общие переменные из% dopar% block?

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

library("doParallel") 
library("foreach") 

cluster <- makeCluster(4) 
registerDoParallel(cluster) 

result = matrix(nrow=5, ncol=5) 

foreach (i = 1:5) %dopar% { 
    result[[i, i]] <<- i 
} 

Не могли бы вы предложить какой оператор/функция/пакет, я должен использовать для того, чтобы добиться такого поведения, то есть изменение общих переменных из некоторого параллельного блока кода? Предположим, что нет столкновений и/или условий гонки.

ответ

0

Я думаю, что %dopar% начинает с отправки копии общей переменной на каждый кластер-узел. Это делает невозможным их изменение, если вы снова не запустите %dopar%.

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

+0

И разве вы не знаете о каком-либо другом подходе? Например. не использовать '% dopar%' вообще? В любом случае спасибо за быстрый ответ :) – petrbel

+0

https://cran.r-project.org/web/views/HighPerformanceComputing.html показывает множество опций, как выполнять параллельные вычисления в R. Мои два предложения: 1. чтение/запись данных из базы данных и тем самым получить доступ к тем же данным во всех кластерных узлах 2. использовать Hadoop/Spark – Tobi

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