При использовании распараллеливания R похоже копирует все, что возвращается из дочернего процесса, даже если объекты не изменены. В частности, рассмотрим следующий пример:
env1 <- new.env()
envs2 <- lapply(1:4, function(x) env1)
cl<-makeCluster(2, type="FORK")
envs3 <- parLapply(cl, 1:4, function(x) env1)
envs4 <- parLapply(cl, 1:4, function(x) capture.output(str(env1)))
stopCluster(cl)
env1
envs2
envs3
envs4
Сначала я создаю среду (env1
). Затем, используя непараллельно lapply
, я получаю список (envs2
), где все записи содержат указатель на env1
. Теперь при использовании параллельной parLapply
записи в списке, который я получаю (envs3
), содержат указатели на разные объекты, которые предположительно являются клонами env1
(Также обратите внимание, что первые две записи содержат тот же указатель, что и последние два ; предположительно, потому что я использую 2 дочерних узла для цикла длиной 4). Такое клонирование происходит, когда дочерний узел возвращает свои результаты мастеру. Чтобы увидеть это, я сохраняю указатель env1
в дочерних узлах в списке envs4
.
Почему нетронутые среды клонируются в момент их возвращения? И есть ли способ сделать R не клонированными средами, которые не изменились?