ParallelLogger показывает отсутствие вывода на консоль и вывод файла поврежден - PullRequest
0 голосов
/ 17 сентября 2018

Недавно я начал переключать мой код на параллельное выполнение, используя пакеты foreach и doParallel.Регистрация с futile.logger работает плохо из-за того, что разные потоки мешают друг другу.Поэтому я начал использовать ParallelLogger, который должен обрабатывать журналы даже в параллельной настройке.К сожалению, у меня есть две проблемы с этим логгером, которые я не могу решить самостоятельно, возможно, я делаю что-то не так, или есть ошибка в Системе.

  1. Первая проблема заключается в том, что несмотря наПри создании приложения для консоли (см. MWE ниже) ни один поток не входит в консоль.
  2. Файл журнала, созданный моим регистратором, поврежден из-за того, что launchLogViewer выдает ошибку line 40 did not have 6 elements.

Вот MWE:

library(foreach)
library(doParallel)
library(ParallelLogger)

LOGGING_FILE_PATH <- "Parallel_MWE.log"

diff_time <- function(start_time) {
  format(difftime(Sys.time(), start_time))
}

block_execution <- function(start_se, end_se) {
  logInfo("Start Data Loading")
  start_time_loading <- Sys.time()
  Sys.sleep(2)

  logInfo("Data Loading Done: ", diff_time(start_time_loading))
  logInfo("Start Data Preprocessing")
  start_time_computation <- Sys.time()
  logInfo(paste("Start:", sprintf("%04d", start_se),
   "End:", sprintf("%04d", end_se),
   sep = " "
  ))
  Sys.sleep(2)

  logInfo("Computation Done: ", diff_time(start_time_computation))
  logInfo("Start Data Postprocessing")
  start_time_writing <- Sys.time()
  Sys.sleep(2)

  logInfo("Data Postprocessing Done: ", diff_time(start_time_writing))
  logInfo("Overall time taken: ", diff_time(start_time_whole))
  logInfo("Current allocated Memory: ", memory.size(), " MB\n")
}

registerLogger(createLogger(
  name = "ParLogger",
  threshold = "INFO",
  appenders = list(
    createConsoleAppender(
      layout = layoutSimple
    ),
    createFileAppender(
      layout = layoutParallel,
      fileName = LOGGING_FILE_PATH
    )
  )
))

logInfo("Start Programm")

start_time_whole <- Sys.time()
cluster <- makeCluster(detectCores())
registerDoParallel(cluster)

start <- 0100
end <- 9000
step <- 0100

foreach(i = seq(start, end, step), .packages = c("ParallelLogger")) %dopar% {
  block_execution(i, (i + step))
}

stopCluster(cluster)
logInfo("Programm Done: ", format(difftime(Sys.time(), start_time_whole)))
clearLoggers()

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

2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Overall time taken: 39.00498 secs
2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB 
cs
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Overall time taken: 39.07554 secs
2018-09-17 10:47:57 [Thread 4]  INFO  doParallel  fun  Start Data Loading
2018-09-17 10:47:57 [Thread 2]  INFO  doParallel  fun  Data Postprocessing Done: 2.063492 secs
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB 
2018-09-17 10:47:57 [Thread 1]  INFO  doParallel  fun  Start Data Loading
39.10681 secs
2018-09-17 10:47:57 [Thread 3]  INFO  doParallel  fun  Data Postprocessing Done: 2.049974 secs
2018-09-17 10:47:57 [Thread 2]  INFO  doParallel  fun  Current allocated Memory: 42.01 MB


2018-09-17 10:49:15 [Thread 3]  INFO  doParallel  fun  Start: 7500 End: 7600
g
2018-09-17 10:49:15 [Thread 4]  INFO  doParallel  fun  Start: 7600 End: 7700

Как вы можете видеть некоторые строкинеправильно деформированы или разрезаны на части.Если я удаляю эти ошибочные строки, launchLogViewer работает просто отлично.

Так как мне записать параллельный R-скрипт с несколькими потоками в файл и на консоль?Или как заставить ParallelLogger войти в файл и консоль, не повреждая вывод?


Редактировать:

Запуск MWE под Linux-системой приводит ккрасиво отформатированный лог-файл.Так что, похоже, проблема для Windows.

1 Ответ

0 голосов
/ 24 сентября 2018

Часть «журнал не отображается в консоли» происходит из-за того, что отдельные потоки не имеют канала stdout, так что это не ошибка.Я говорил с разработчиком о форматировании файла журнала, и оказалось, что доза ParallelLogger не имеет управления транзакциями, поэтому вы ничего не можете с этим поделать.

...