Я часто получаю несколько вложенных циклов foreach
, а иногда при написании общих функций (например, для пакета) нет уровня, на котором очевидным образом можно распараллелить. Есть ли какой-нибудь способ выполнить то, что описывается в макете ниже?
foreach(i = 1:I) %if(I < J) `do` else `dopar`% {
foreach(j = 1:J) %if(I >= J) `do` else `dopar`% {
# Do stuff
}
}
Кроме того, есть ли способ определить, зарегистрирован ли параллельный сервер, чтобы я мог избежать ненужных предупреждающих сообщений? Это было бы полезно как при проверке пакетов перед отправкой CRAN, так и для того, чтобы не беспокоить пользователей, использующих R на одноядерных компьютерах.
foreach(i=1:I) %if(is.parallel.backend.registered()) `dopar` else `do`% {
# Do stuff
}
Спасибо за ваше время.
Изменить: Большое спасибо за все отзывы о ядрах. и рабочие, и вы правы в том, что лучший способ справиться с приведенным выше примером - это переосмыслить всю настройку. Я бы предпочел, чтобы идея triu
была приведена ниже, но, по сути, это то же самое. И, конечно же, это можно было бы сделать с помощью параллельного приложения
, как предлагал Джорис.
ij <- expand.grid(i=1:I, j=1:J)
foreach(i=ij$I, j=ij$J) %dopar% {
myFuction(i, j)
}
Однако, пытаясь упростить ситуацию, которая породила эту тему, я упустил некоторые важные детали. Представьте, что у меня есть две функции анализировать
и batch.analyse
, и лучший уровень для распараллеливания может отличаться в зависимости от значений n.replicates
и ] n.time.points
.
analyse <- function(x, y, n.replicates=1000){
foreach(r = 1:n.replicates) %do% {
# Do stuff with x and y
}
}
batch.analyse <- function(x, y, n.replicates=10, n.time.points=1000){
foreach(tp = 1:time.points) %do% {
my.y <- my.func(y, tp)
analyse(x, my.y, n.replicates)
}
}
Если n.time.points> n.replicates
, имеет смысл распараллелить в batch.analyse
, но в противном случае имеет смысл распараллелить в analysis
. Есть идеи, как с этим справиться? Можно ли как-нибудь обнаружить в analysis
, если распараллеливание уже произошло?