Я столкнулся с несколькими явными проблемами, пытаясь ускорить автоматическое создание отчетов для большого набора данных. Я использую R + markdown -> HTML для создания отчета и перебираю ~ 10K отдельных группировок для отчета, обращающегося к данным из Oracle.
Система состоит в основном из двух частей.
- основной сценарий
- файл шаблона уценки
Главный скрипт настраивает вычислительную среду и бэкенды параллельной обработки:
library(ROracle)
library(doParallel) ..etc
....
cl <- makeCluster(4)
clusterEvalQ(cl, con<-dbConnect(db,un,pw)) ##pseudocode...
Здесь возникает первая проблема. R выдает исключение, в котором говорится, что подключения к рабочим недействительны, НО, когда я отслеживаю живые сеансы в Oracle, они кажутся в порядке ...
Далее основная функция вызывает цикл для генерации отчета.
foreach(i=1:nrow(reportgroups), .packages=c('ROracle', 'ggplot2', 'knitr') %dopar% ##...etc
{
rmarkdown::render(inputfile.Rmd, outputfile.html, params=list(groupParam1[i], groupParam2[i], etc)
}
Если я запустил цикл foreach последовательно, то есть% do% вместо% dopar%, все будет работать нормально. Нет ошибок, тогда весь набор работает правильно (я тестировал только ~ 400 групп, выполню полный запуск всех 10k за ночь).
Однако, если я попытаюсь запустить цикл параллельно, pandoc неизменно выдаст ошибку №1 при преобразовании файла. Если я запускаю прерванный цикл несколько раз, «задача» в цикле (или кластере, не уверен, какая задача относится к этому контексту), которая вызывает ошибку, изменяется.
Файл шаблона довольно простой, он принимает параметры для групп, запускает SQL-запрос для соединения, определенного для работника кластера, и использует ggplot2 + dplyr для генерации результатов. Поскольку похоже, что шаблон работает не через кластер, я считаю, что проблема должна быть как-то связана с объектами подключения в узлах кластера из ROracle, хотя я недостаточно знаю об этом предмете, чтобы действительно точно определить проблему.
Если у кого-то был подобный опыт или есть подозрение о том, что происходит, любой совет будет оценен!
Дайте мне знать, если я смогу что-нибудь уточнить ...
Спасибо