Параллельный цикл for дает неправильный вывод - PullRequest
0 голосов
/ 11 октября 2018

Я пытаюсь распараллелить вложенный цикл for с помощью пакета foreach.Однако, хотя скорость намного выше, она не дает правильного ответа.Идея этого вложенного цикла for довольно проста.Результат (число) самого внутреннего вложенного цикла добавляется ко второму уровню цикла, который добавляется к третьему уровню цикла.Ниже приведены воспроизводимые данные:

input <- data.frame(matrix(rnorm(100*100, 1, .5), ncol=100))
input[input <0] =0
input2 <- split(input, f=input$X201)

d= 0
n= 0
j = 1
k = 1
f = 0
s= 0


cl <- parallel::makeCluster(20)
doParallel::registerDoParallel(cl)
tm1 <- system.time(

 results2 <- foreach(h = (1:length(input2)),.combine = 'c')%dopar%{
   return (   for (j in (1:nrow(input2[[h]]))){
     for (k in (1:nrow(input2[[h]]))){
       if (k != j) {

         for (i in (2:ncol(input2[[h]]))){
           if (input2[[h]][j,i] !=0){
             n= n+ (input2[[h]][j,i] * input2[[h]][k, i])
             d= d+ input2[[h]][j, i] * input2[[h]][j, i]
           }else {
             n= n
           }

         }
         f= f+ n/d* input2[[h]][k, 1]

       }

       n= 0
       d= 0
     }

     s= s+ f* input2[[h]][j,1]

     k = 1
     f = 0
   }
)
 } 


)
parallel::stopCluster(cl)
registerDoSEQ()
print("Cluster stopped.")
results2

Конечный результат results2 равен нулю.Кроме того, после запуска цикла foreach я обнаружил, что только i равно 8, h равно 6, а k и j равны только 1, что кажется неправильным, поскольку я хочу, чтобы k в любое время было неравным j (как указано в коде), иЯ ожидаю, что h будет 10 (потому что в списке 10 элементов).Я также ожидаю, что мне будет 20, потому что в каждом элементе есть 20 строк данных.Интересно, почему я не прав в коде.

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

foreach() не обновляет переменную внутри цикла.Рассмотрим следующий пример:

library(foreach)
library(doParallel); registerDoParallel(2)
j <- 1
out <- foreach(i=1:4, .combine=rbind) %dopar% {
    j <- i*10
    c(i=i, j=j)
}

j не обновляется.

j
[1] 1

Следовательно, необходимо вернуть все интересующие переменные.В приведенном выше примере значения i и j возвращаются в виде матрицы.

> out
         i  j
result.1 1 10
result.2 2 20
result.3 3 30
result.4 4 40
0 голосов
/ 15 октября 2018

R foreach возвращает обратные результаты, вместо этого позволяет изменять внешнюю переменную.Так что не ожидайте, что d, n будет обновлено правильно.Рассматривайте результаты как способ уменьшить карту и провести параллель для самого верхнего цикла for.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...