我有一个R脚本和一个Pentaho(PDI)ETL转换,用于从SQL数据库加载数据并执行计算。初始数据集有218万行21个变量,在R和PDI中都是等价的。事实上,我最初编写了R代码,然后“移植”到PDI中的转换。
PDI转换在30秒内运行(并包括将输出写入单独的DB表的附加步骤)。 R脚本总共需要45米到1小时。我意识到R是一种脚本语言并因此被解释,但似乎我在这里缺少一些优化机会。
以下是代码大纲:
sqlQuery()
包中的RODBC
将数据从SQL DB读入数据框(~45s)str_trim()
两列(~2 - 4s)split()
将数据放入分区以准备执行定量计算(单独功能)(~30m)parLapply()
(~15-20m)我尝试使用ddply()
而不是split()
,parLapply()
和rbind()
,但它已经运行了几个小时(> 3)而未完成。我还修改了SQL select语句,以返回一个人工组ID,它是基于两列唯一对的行的密集排名,以提高性能。但它似乎没有达到预期的效果。我已尝试使用isplit()
和foreach() %dopar%
,但这也会持续数小时而没有结束。
PDI转换正在运行Java代码,这通常比R更快。但似乎等效的R脚本应该花费不超过10分钟(即比PDI / Java慢20倍),而不是一小时或更长时间。
有关其他优化技术的想法吗?
更新:上面的第3步split()
已使用此处建议的索引解决Fast alternative to split in R
更新2:我尝试使用mclapply()
代替parLapply()
,而且大致相同(约25米)。
更新3: rbindlist()
而不是rbind()
在2s以下运行,这解决了第5步