Как изменить общие объекты, используя foreach l oop в R? - PullRequest
1 голос
/ 23 февраля 2020

Я пытаюсь ускорить for-l oop, преобразовав его в for-each l oop параллельно. Однако это вызывает некоторые проблемы, когда необходимо изменить некоторые общие объекты. Примером игрушки может быть следующий:

library(doParallel)
registerDoParallel(cores = 4)
a <- c()
b <- c()
foreach(i = 1:100, .combine = cbind) %dopar% {
  a <- c(a, i)
  b <- c(b, i^2)
  NULL  # to take up a place for the return statement
}
a
b

В идеале, я бы хотел, чтобы вектор a был c(1, 2, 3, ..., 100), а b был c(1, 4, 9, ..., 10000), где порядок элементов не дело. Однако результат из приведенного выше фрагмента кода - вектор a и вектор b - оба пусты.

Кто-нибудь имеет представление о том, что происходит и как это исправить?

Спасибо!

- Правка -
Чтобы дать вам немного больше контекста, я пытаюсь распараллелить алгоритм BFS в R. Скелет кода выглядит как следующее:

q <- queue()
s <- set()
l <- list(...)
while(length(q) > 0){
  element <- pop(q)
  for(edge connect to element){
    if(!s contains edge && some other conditions){
      s <- set_union(s, <something new>)
      pushback(q, <something new>)
      l[[1]] <- <something new>
    }
  }
}

Я пытаюсь преобразовать внутренний for-l oop в foreach l oop, который может распространять вычисления для этих ребер на разные ядра. Однако набор структур данных, очередь и список являются общими. Если не существует простого способа получения блокировок для них, есть ли у них соответствующие параллельные структуры данных, такие как ConcurrentHashMap для HashMap в Java?

1 Ответ

2 голосов
/ 23 февраля 2020

Я не уверен, что это то, что нужно после ОП, но он возвращает data.frame с двумя ожидаемыми векторами:

library(doParallel)
registerDoParallel(cores = 4)
result <- foreach(i = 1:10, .combine = rbind) %dopar% {
  a <- i
  b <- i^2
  data.frame(a, b)
}
result
    a   b
1   1   1
2   2   4
3   3   9
4   4  16
5   5  25
6   6  36
7   7  49
8   8  64
9   9  81
10 10 100

Обратите внимание, что у меня есть уменьшил количество итераций до 10 для демонстрации.

...