R разветвления и окружения / указатели - PullRequest
0 голосов
/ 11 сентября 2018

При использовании распараллеливания 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 не клонированными средами, которые не изменились?

...