Как я могу печатать при использовании% dopar%

у меня естьforeach цикл, который использует%dopar% сdoSNOW в качестве фона. Как сделать так, чтобы цикл печатал что-то на каждой итерации?

Мой код ниже - это то, что я сейчас использую, но ничего не печатаю.

foreach(ntree=rep(25,2),.combine=combine,.packages='randomForest',
    .inorder=FALSE) %dopar% {
        print("RANDOM FOREST")
        randomForest(classForm,data=data,na.action=na.action,do.trace=do.trace,ntree=ntree,mtry=mtry)
    }   
 Noam Ross06 мая 2013 г., 20:56
Можно ли написать функцию итератора, которая печатает на консоль? Итератор должен запускаться мастером, нет?
 Steve Weston09 авг. 2013 г., 17:57
@NoamRoss Да, итератор работает только на мастере, поэтому он может записывать на консоль. Это позволит вам отслеживать задачи, отправляемые работникам, а не когда задачи фактически выполняются работниками.
 Joshua Ulrich06 июн. 2012 г., 01:04
Я не знаю ни о чем, и я не уверен, как это можно сделать.
 someoneHuman05 июн. 2012 г., 21:54
Ох, ну ладно. В таком случае, есть ли способ, чтобы я мог посмотреть, что его печать или его печать на мастер-узел?
 Joshua Ulrich05 июн. 2012 г., 21:53
ах, но это печать, только не на главном узле ...

Ответы на вопрос(6)

cat("blah-blah-blah\n", file=stdout()) имеет тенденцию работать для меня (linux / emacs / ess). Я думаю, это также работает для некоторых других платформ.

 02 апр. 2018 г., 06:46
Как ни странно, это журналы, если вы хвостoutfile что вы указали наmakeCluster, Что заставляет меня задуматься о том, что печатные издания делают иначе, чем это.
Решение Вопроса

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

Я использую следующую функцию:

log.socket <- make.socket(port=4000)

Log <- function(text, ...) {
  msg <- sprintf(paste0(as.character(Sys.time()), ": ", text, "\n"), ...)
  cat(msg)
  write.socket(log.socket, msg)
}

Затем вы можете поместить записи журнала в коде, например:

Log("Processing block %d of %d", i, n.blocks)

Вывод журнала можно просматривать в режиме реального времени с помощью любого простого инструмента прослушивания сокетов. Например, используя netcat в Linux:

nc -l 4000

Вышеуказанный лог-оператор будет отображаться в терминале netcat как:

2014-06-25 12:30:45: Processing block 2 of 13

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

p.s. Для тех, кто в Windows, см.Порт Netcat от Jon Craton.

p.p.s Я угадываюwrite.socket Функция R, вероятно, не является поточно-ориентированной, но если вы не регистрируетесь с высокой частотой, вы вряд ли столкнетесь с какой-либо проблемой. Что-то, чтобы знать, хотя.

 09 февр. 2018 г., 20:14
Надо бежатьnc -l 4000 в терминале Linuxbefore проведениеlog.sock = make.socket(port=4000) вR

ого леса, используя пакет foreach, и хотел напечатать & quot; Результаты & quot; после каждой итерации, но не мог понять, не отображая индикатор выполнения и т.п.

Вот что я сделал, В моей функции Я добавил эту строку

write.table(result, file=paste("RF_ntree_",ntree,"_dims_",dims,".txt", sep=""),
  sep="\t", row.names=F)

Поэтому после каждой итерации результаты записываются в текстовый файл с такими именами, как RF_ntree_250_dims_100.txt.

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

PS: результаты накапливаются в кадре данных тоже.

полученный снеговиками, по умолчанию отбрасывается, но вы можете использовать makeCluster & quot; outfile & quot; возможность изменить это. Установка outfile для пустой строки (& quot; & quot;) предотвратит перенаправление вывода снегом, что часто приводит к выводу ваших сообщений печати, отображаемых на терминале главного процесса.

Просто создайте и зарегистрируйте свой кластер с чем-то вроде:

library(doSNOW)
cl <- makeCluster(4, outfile="")
registerDoSNOW(cl)

Ваш цикл foreach не нуждается в изменении вообще.

Это работает для меня как с кластерами SOCK, так и с кластерами MPI, использующими Rmpi, созданный с помощью Open MPI. В Windows вы не увидите никаких выходных данных, если используете Rgui. Если вы используете Rterm.exe вместо этого, вы будете.

Обратите внимание, что в дополнение к собственному выводу вы увидите сообщения, создаваемые снегом, которые также могут быть полезны.

Для использования индикатора выполнения в DoSNOW версии 1.0.14 естьprogress вариант. Вот полный пример:

library(doSNOW)
library(tcltk)
library(randomForest)
cl <- makeSOCKcluster(3)
registerDoSNOW(cl)

ntasks <- 100
pb <- tkProgressBar(max=ntasks)
progress <- function(n) setTkProgressBar(pb, n)
opts <- list(progress=progress)

x <- matrix(runif(500), 100)
y <- gl(2, 50)

rf <- foreach(ntree=rep(25, ntasks), .combine=combine,
        .multicombine=TRUE, .packages='randomForest',
        .options.snow=opts) %dopar% {
  randomForest(x, y, ntree=ntree)
}

progress Параметр довольно общий, поэтому вы можете просто напечатать сообщение, используя такую функцию, как:

progress <- function(n) cat(sprintf("task %d is complete\n", n))

Функция может принимать 0, 1 или 2 аргумента. Первый предоставленный аргумент - это общее количество выполненных задач, а второй - номер задачи, которая только что завершила.

Простейший пример просто печатает. когда задача завершена:

progress <- function() cat('.')

Этот пример отображает оба аргумента и может использоваться для демонстрации того, что задачи не всегда выполняются по порядку:

progress <- function(nfin, tag) {
  cat(sprintf('tasks completed: %d; tag: %d\n', nfin, tag))
}
 21 дек. 2015 г., 20:39
Есть ли эквивалентные решения для направления вывода сообщений на печать на консоль сdoMC?
 02 февр. 2018 г., 18:48
@ SteveWeston Впервые это происходит со мной: когда я Google.options.snowЯ не вижу абсолютно никакой документации, кроме этой вашей ветки. Можете ли вы объяснить, что происходит под капотом? Гдеprogress получениеn от?
 01 февр. 2018 г., 21:31
@ SteveWeston Мне нравится решение индикатора выполнения. Но бывают случаи, когда я хочу видеть фрагменты результата в каждой итерации. Есть ли способ сделать эквивалент кота («результат на нем я»)?
 21 дек. 2015 г., 21:32
@MattSM При использовании doMC выходные данные рабочих отображаются по умолчанию на консоли при использовании стандарта R. При использовании RStudio могут возникнуть проблемы, но я не думаю, что doMC рекомендуется при использовании RStudio из-за проблем с разветвлением. Кроме того, doMC не поддерживает индикатор выполнения из-за ограничений в параллельном пакете.
 02 февр. 2018 г., 16:39
@horaceT Если вы используете параллельный бэкэнд, который на лету вызывает функцию объединения (например, doSNOW или doMPI), то вы можете легко отобразить фрагменты результатов из функции объединения. Но имейте в виду, что функция объединения вызывается только для каждого сотого результата, если вы не уменьшите значение.maxcombine.

которым я отслеживал прогресс на узлах во время длительных операций, состоит в создании индикатора выполнения с использованиемtkProgressBar отtcltk пакет. Это не совсем то, что вы просили, но оно должно позволить вам увидеть что-то из узлов. По крайней мере, это происходит, когда кластер является кластером сокетов, работающим на локальном хосте (который является машиной Windows). Потенциальная проблема заключается в том, что индикатор выполнения либо остается и загромождает ваш монитор, либо он получаетclosed и распечатанная информация исчезла. Для меня это не было проблемой, так как я просто хотел узнать, каков текущий статус.

library(parallel)
library(doSNOW)
cl<-makeCluster(detectCores(),type="SOCK")
registerDoSNOW(cl)

Используя ваш код,

foreach(ntree=rep(25,2),.combine=combine,.packages=c('randomForest','tcltk'),
    .inorder=FALSE) %dopar% {
        mypb <- tkProgressBar(title = "R progress bar", label = "",
          min = 0, max = 1, initial = 0, width = 300)
        setTkProgressBar(mypb, 1, title = "RANDOM FOREST", label = NULL)
    ans <- randomForest(classForm,data=data,na.action=na.action,do.trace=do.trace,ntree=ntree,mtry=mtry)
    close(mypb)
    ans
    }

Here's a more general use example:

jSeq <- seq_len(30)

foreach(i = seq_len(2), .packages = c('tcltk', 'foreach')) %dopar% {
    mypb <- tkProgressBar(title = "R progress bar", label = "",
        min = 0, max = max(jSeq), initial = 0, width = 300)
    foreach(j = jSeq) %do% {
        Sys.sleep(.1)
        setTkProgressBar(mypb, j, title = "RANDOM FOREST", label = NULL)
    }
    NULL
}
 17 мар. 2014 г., 14:26
Привет! Я попытался использовать индикатор выполнения, но не могу заставить его работать, используя параллельные циклы for. Каждый раз, когда я запускаю его, я получаю «XIO: фатальная ошибка ввода-вывода». Как вы обходите это? @BenBarnes
 17 мар. 2014 г., 19:13
@TAllieri, пожалуйста, посмотрите обновленный пример (оригинальный пример не был очень иллюстративным). Если у вас все еще есть проблемы, пожалуйста, предоставьте больше информации и рассмотрите возможность задать новый вопрос.

пакета log4r) и отдельная печать вывода на экране (например, с помощью «tail -f»).

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

 09 февр. 2018 г., 03:33
Нет, но вы можете проверить это. Я использовал это только для относительно медленных задач.
 08 февр. 2018 г., 19:55
Любая идея, что влияет на производительность? то есть. дополнительное время обработки в файле IO.

Ваш ответ на вопрос