优化ETL的R代码

时间:2013-11-04 20:38:23

标签: sql r performance pentaho

我有一个R脚本和一个Pentaho(PDI)ETL转换,用于从SQL数据库加载数据并执行计算。初始数据集有218万行21个变量,在R和PDI中都是等价的。事实上,我最初编写了R代码,然后“移植”到PDI中的转换。

PDI转换在30秒内运行(并包括将输出写入单独的DB表的附加步骤)。 R脚本总共需要45米到1小时。我意识到R是一种脚本语言并因此被解释,但似乎我在这里缺少一些优化机会。

以下是代码大纲:

  1. 使用sqlQuery()包中的RODBC将数据从SQL DB读入数据框(~45s)
  2. str_trim()两列(~2 - 4s)
  3. split()将数据放入分区以准备执行定量计算(单独功能)(~30m)
  4. 使用parLapply()(~15-20m)
  5. 为数据的每个分区并行运行计算函数
  6. 将结果整合到一个结果数据框(~10 - 15m)
  7. 我尝试使用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步

0 个答案:

没有答案