【发布时间】:2013-10-05 15:24:17
【问题描述】:
我的代码很大,聚合步骤是当前速度方面的瓶颈。
在我的代码中,我希望加快数据分组步骤的速度。我的数据的 SNOTE(简单的非平凡示例)如下所示:
library(data.table)
a = sample(1:10000000, 50000000, replace = TRUE)
b = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
d = sample(c("3m","2m2d2m","3m2d1i3s2d","5m","4m","9m","1m"), 50000000, replace = TRUE)
e = a
dt = data.table(a = a, b = b, d = d, e = e)
system.time(c.dt <- dt[,list(b = paste(b, collapse=""), d = paste(d, collapse=""), e = e[1], by=a)])
user system elapsed
60.107 3.143 63.534
对于如此大的数据示例,这相当快,但就我而言,我仍在寻找进一步的加速。就我而言,我有多个内核,所以我几乎可以肯定一定有一种方法可以使用这种计算能力。
我愿意将我的数据类型更改为 data.frame 或 idata.frame 对象(理论上 idata.frame 应该比 data.frames 更快)。
我做了一些研究,似乎 plyr 包有一些并行功能可能会有所帮助,但我仍在努力为我正在尝试做的分组做这件事。在another SO post they discuss some of these ideas。由于它使用了 foreach 函数,我仍然不确定通过这种并行化可以实现多少。根据我的经验,foreach function 对于数百万个快速操作来说并不是一个好主意,因为内核之间的通信工作最终会减慢并行化工作。
【问题讨论】:
-
请更具体地了解“连接”和“聚合”这两个词的含义。这些让人想到的功能是3:
list、c和paste。该代码的功能是什么。我们是从数据框中提取列还是处理 data.tables? 'block.read.parent.cigar' 和其他输入变量的结构是什么.....更好地解释了这个问题! (显然其他人同意。这不是我的反对意见。) -
@Dwin,谢谢!我不确定我在 Q 中是否澄清得足够清楚,但基本的 Q 是如何加快对上例中的大型数据表的聚合操作。还要记住,我可以使用多个内核,因此可能会有一些智能并行化想法可以大大加快此类操作。希望这会有所帮助,我添加了一个示例
-
我没有投反对票。但我会这样做的原因是您没有提供有关数据的任何信息。如果
read.index是行索引,那么将每一行单独分组到一行当然会很慢。您将致电paste数百万次。你用Rprof了吗?你用verbose=TRUE了吗?而且您使用诸如“太慢”之类的词而没有给出数字。事实上,我现在已经说服自己反对它。如果你改进了问题,它可以逆转。 -
@Dnaiel 现在这是一个很好的问题。 +1。我会试着看看。我猜有些回答者只是有新的问题提要,所以为了获得更多关注,提供赏金可能是一个想法。
-
@MattDowle 非常感谢,我很高兴我改进了这种令人困惑的 Q :-) 不确定它有多棒,但这就是我正在处理的问题。我正在学习如何提出更好的问题,这对我有好处。
标签: r data.table mclapply