【发布时间】:2012-05-14 04:47:58
【问题描述】:
众所周知,R 并不是运行大型分析的最有效平台。 如果我有一个包含三个参数的大型数据框:
GROUP X Y
A 1 2
A 2 2
A 2 3
...
B 1 1
B 2 3
B 1 4
...
millions of rows
我想在每个组上运行一个计算(例如在 X,Y 上计算 Pearson 的 r)并将结果存储在一个新的数据框中,我可以这样做:
df = loadDataFrameFrom( someFile )
results = data.frame()
for ( g in unique( df$GROUP)) ){
gdf <- subset( df, df$GROUP == g )
partialRes <- slowStuff( gdf$X,gdf$Y )
results = rbind( results, data.frame( GROUP = g, RES = partialRes ) )
}
// results contains all the results here.
useResults(results)
明显的问题是这非常慢,即使在强大的多核机器上也是如此。
我的问题是:是否可以并行化这种计算,例如为每个组或一组组设置一个单独的线程? 是否有一个干净的 R 模式来解决这个简单的分而治之问题?
谢谢, 木龙
【问题讨论】:
-
如何并行化很大程度上取决于计算类型,不是吗?
-
您是否刻意尝试尽一切可能使此过程尽可能慢?我不确定你写这个效率会不会更低。
-
+1 乔希的评论。
rbind在循环中经常出现,也许 R 本身可以检测到它并发出警告。警告消息可能是“在 for() 循环的最后一行检测到 rbind,这可能非常慢。请参阅 XYZ 参考以获取建议。”。也许需要解析器中的一个 if() 语句? -
@MatthewDowle 如果实现了,我会坚持伴随一个 Clippy 的小弹出窗口说“看起来你正在尝试在一个 for 循环..." :)
-
也许Revolution会认为这是一个更显着的特点?
标签: r parallel-processing dataframe divide-and-conquer