2013-06-27 3 views
11

Я использую mclapply из RStudio и хотел бы получить вывод на консоль из каждого процесса, но это, похоже, как-то подавлено (как указано здесь: Is mclapply guaranteed to return its results in order?). Как я мог бы получить R студии напечатать что-то вродеПечать из mclapply в R Studio

x <- mclapply(1:20, function(i) cat(i, "\n"))

на консоль?

Я пробовал print(), cat(), write(), но все они, похоже, не работают. Я также попытался установить mc.silent = FALSE явно без эффекта.

Спасибо за ваши ответы, мой лучший, Бен

+2

Я «решил» проблему, сначала записав вывод в файл, а затем прочитав и распечатав содержимое этого файла с помощью небольшого скрипта python. Нехорошо, но достаточно, чтобы получить некоторую информацию о прогрессе mclapply. – obachtos

ответ

7

Параллельная обработка с графического интерфейса является проблематичным. Я пишу много параллельного кода, и он постоянно разбивает компьютер моего коллеги, потому что он настаивает на использовании Rstudio вместо консоли R.

Из того, что я читал, RStudio «не распространяет вывод разветвленных процессов на консоль RStudio. вы делаете это, лучше всего запустить R через оболочку ».

Это имеет смысл в качестве обходного пути для людей RStudio, поскольку параллельная обработка обычно ломает GUI, когда люди пытаются вывести на графический интерфейс из множества различных процессов. Он работает в консоли (хотя часто не в порядке), но гуру параллельной обработки зажимают свои носы, когда они слышат о любом вводе-выводе из разветвленной нити.

Если у вас должен быть выход из разветвленных потоков, сохраните их в строке и верните. Затем собирайте и выводите из основного процесса. Или просто используйте консоль для параллельных прогонов. То, что я рассказываю коллеге, - это сделать всю его отладку и разработку в RStudio с помощью lapply(), а затем переключиться на консоль для реального запуска.

1

Просто расширяющийся немного на растворе, используемом в Аскер, то есть запись в файл, чтобы проверить прогресс:

write.file = '/temp_output/R_progress' 

time1 = proc.time()[3] 
outstuff = unlist(mclapply(1:1000000, function(i){ 
    if (i %% 1000 == 0){ 
    file.create(write.file) 
    fileConn<-file(write.file) 
    writeLines(paste0(i,'/',nrow(loc),' ',(i/nrow(loc)*100)), fileConn) 
    close(fileConn) 
    } 
    #do your stuff here 
}, mc.cores=6)) 
print(proc.time()[3] - time1) 

И тогда вы можете контролировать с помощью консоли с

хвост -c +0 -f '/ temp_output/R_progress'