Почему tempdir () дает одинаковый результат на каждом ядре кластера ветвлений? - PullRequest
0 голосов
/ 06 июня 2018

Я хочу запустить несколько примеров начальной загрузки параллельно.Расчет включает в себя создание временного каталога для каждого образца.Я использую пакет future с plan(multisession), который автоматически создает кластер форка на моей машине linux для параллельного запуска примеров.

Моя проблема в том, что tempdir() не возвращает разные результаты для каждого образца, даже если я set.seed(.) по-разному для каждого ядра.

MCVE (это не будет работать в Windows, потому что Windows не может fork()):

clu <- parallel::makeForkCluster(4)
unlist(parallel::clusterApply(clu, 1:4, 
  function(x){ set.seed(x); tempdir() }))
## [1] "/tmp/Rtmp0uaUin" "/tmp/Rtmp0uaUin" "/tmp/Rtmp0uaUin" "/tmp/Rtmp0uaUin"

Если я перезагружаю R, я получаю разные результаты, но для сеанса возвращаются все значенияравно.

С другой стороны, другие случайные функции работают нормально, по крайней мере, если я включу set.seed(x)

unlist(parallel::clusterApply(clu, x = 1:4, 
  function(x){ set.seed(x); rnorm(1) }))
##[1] -0.6264538 -0.8969145 -0.9619334  0.2167549

unlist(parallel::clusterApply(clu, x = 1:4, 
  function(x){ rnorm(1) }))
## [1] -1.100044 -1.100044 -1.100044 -1.100044

Почему tempdir() ведет себя иначе, чем другие случайные функции, и чтоя могу с этим поделать?

1 Ответ

0 голосов
/ 06 июня 2018

Цитирование из ?tempdir:

[...] временный каталог для сеанса создается до запуска интерпретатора.

Итак, начальный Rпроцесс исправляет и создает tempdir(), и разветвленные процессы наследуют это.Одним из возможных решений является создание новых временных каталогов на основе tempfile():

unlist(parallel::mclapply(1:4, function(x){ tempfile(pattern = "dir") }))
#> [1] "/tmp/Rtmpl1ynxV/dir42bb40fa8f75" "/tmp/Rtmpl1ynxV/dir42bc40fa8f75"
#> [3] "/tmp/Rtmpl1ynxV/dir42bb2c930883" "/tmp/Rtmpl1ynxV/dir42bc2c930883"

Обратите внимание, что я использую mclapply, поскольку он обрабатывает заполнение RNG по умолчанию.

...