Как распечатать из clusterApply? - PullRequest
1 голос
/ 08 июня 2019
library(parallel)
cl=makeCluster(4)
txts = c("I", "AM", "NOT", "PRINTED")
clusterApply(cl, txts, function(txt){write(txt, stderr())})
stopCluster(cl)
txts = c("WHILE", "I", "AM", "PRINTED")
lapply(txts, function(txt){write(txt,stderr())})

При выполнении приведенного выше кода вызовы write из clusterApply, похоже, игнорируются: ничего не печатается.

Причина, по которой я хочу печатать из clusterApply, заключается в том, чтоожидается, что выполнение кода, который я собираюсь выполнить, займет много часов;Я хочу иметь возможность отслеживать прогресс.

Я нашел удивительный способ печати с clusterApply;а именно код C ++, запускаемый через Rcpp из clusterApply, может выводиться на консоль через std::cerr.Тем не менее, делать это кажется слишком излишним.

Есть ли другой способ печати из clusterApply?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Вы можете следить за своим прогрессом, используя makeCluster(4, outfile = "").Это также включает вывод write(txt, stderr())

Это решение outfile = "" кажется только для работы на системах Linux.Для получения дополнительной информации о окнах проверьте связанный вопрос и комментарии.Кажется, есть некоторые решения, такие как использование Rterm вместо Rgui, но я не могу предоставить его вам, так как не могу его протестировать.

Я использовал следующий код на xubuntu 18.04 и получал все вызовы.

library(parallel)
cl=makeCluster(4, outfile ="")
txts = c("I", "AM", "NOT", "PRINTED", seq(1,1000000,1))
clusterApply(cl, txts, function(txt){write(txt,stdout())})
stopCluster(cl) 

из документального фильма makeCluster :

outfile:

Куда направлять выходные данные подключения stdout и stderr от рабочих.«» указывает на отсутствие перенаправления (которое может быть полезно только для рабочих на локальной машине).По умолчанию используется значение «/ dev / null» («nul:» в Windows).Другая возможность - путь к файлу на хосте работника.Файлы будут открываться в режиме добавления, так как все работники регистрируются в одном и том же файле.

Поэтому, если вы хотите использовать stderr, вы должны уточнить выходной файл

0 голосов
/ 11 июня 2019

Вам необходимо захватить стандартный вывод, созданный фоновыми рабочими, и вернуть его как часть результатов, а затем повторно вывести его в основной процесс R. Будущая структура делает это автоматически, а также условия «ретрансляции» и сообщений и предупреждений:

> library(future.apply)

> cl <- parallel::makeCluster(4)
> plan(cluster, workers = cl)

> txts <- c("I", "AM", "ALSO", "PRINTED")
> y <- future_lapply(txts, function(txt) {
+   print(txt)
+   message("M: ", txt)
+ })
[1] "I"
M: I
[1] "AM"
M: AM
[1] "ALSO"
M: ALSO
[1] "PRINTED"
M: PRINTED

> parallel::stopCluster(cl)

К вашему сведению, в следующем выпуске будущего пакета выходные данные рабочих будут переданы как можно скорее, т. Е. Как только результаты будут собраны и доступны. В текущей версии он будет передан только после завершения всех рабочих.

Дополнительные комментарии:

Вы не хотите выводить явно stderr() - см. https://github.com/HenrikBengtsson/Wishlist-for-R/issues/55 по одной причине.

Подход к созданию кластера PSOCK с outfile = "" следует считать хаком. Эти выходные данные окажутся в «фоновом режиме», они нигде не будут захвачены R, и то, будет ли он отображаться или нет, сильно зависит от того, в какой среде вы работаете, т.е. его поведение отличается, если R работает в терминале в Linux, в Windows, в Rgui в Windows, RStudio и т. д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...