Я пытаюсь ускорить 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?