在尝试加速大型数据集的一些自动报告生成时,我遇到了几个不同的问题。我正在使用 R + markdown -> HTML 来生成报告,并循环访问约 10K 不同的分组,以便报告访问来自 Oracle 的数据。
该系统主要由两部分组成
- 一个主脚本
- 一个降价模板文件
主脚本设置计算环境和并行处理后端:
library(ROracle)
library(doParallel) ..etc
....
cl <- makeCluster(4)
clusterEvalQ(cl, con<-dbConnect(db,un,pw)) ##pseudocode...
这里似乎出现了第一个问题。R 抛出一个异常,指出工作人员上的连接无效但是当我在 Oracle 上监视实时会话时,它们似乎很好......
接下来,main 调用循环生成报告。
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 的集群节点中的连接对象有关,尽管我对主题的了解还不够,无法真正查明问题。
如果有人有类似的经历,或者对正在发生的事情有预感,任何建议都将不胜感激!
如果我能澄清什么,请告诉我...
谢谢