【发布时间】:2018-03-08 15:49:45
【问题描述】:
这些天我一直在使用 8M 寄存器的 data.frame,我需要改进一个分析这些数据的循环。
我将描述我试图解决的问题的每个过程。 首先,我必须按 ClientID、Date 和 Time 三个字段按升序排列所有 data.frame。 (查看) 然后,使用那个安排好的data.frame,我必须操作每个观察之间的差异,只有当ClientID相同时才能做到这一点。例如:
ClientID|Date(YMD)|Time(HMS)
A|20120101|110000
A|20120101|111500
A|20120101|120000
B|20120202|010000
B|20120202|012030
根据上面的数据,我想要得到的结果如下:
ClientID|Date(YMD)|Time(HMS)|Difference(minutes)
A|20120101|110000|0.00
A|20120101|111500|15.00
A|20120101|120000|45.00
B|20120202|010000|0
B|20120202|012030|20.30
现在的问题是,使用包含 800 万个观测值的 data.frame 分析所有这些,大约需要 3 天时间。我希望我可以并行化这个过程。我的想法是 data.frame 可以按集群进行分割,但是这种分割可以是有序的而不是随机的,然后使用库 foreach 或其他库,可以通过集群进行分析并将其设置为可用的核心数.例如:
Cluster|ClientID|Date(YMD)|Time(HMS)
CORE 1|
1|A|20120101|110000
1|A|20120101|111500
1|A|20120101|120000
CORE 2|
2|B|20120202|010000
2|B|20120202|012030
【问题讨论】:
-
按组计算时间差不应仅花费 3 天时间来进行 8m 次观察。你现在用什么代码?
-
R 是 慢。它在下面使用了一些惊人的快速库,但实际的 R 代码是您会发现的最慢的语言之一。为了使您的代码更快,请尽可能少使用 R,并像所有优秀的 R 包一样用 C、Fortran 等重写性能关键代码。
-
@Anony-Mousse -- 我并不是说你 100% 错了,但我强烈不同意你的建议 “尽可能少使用 R,并重写性能关键代码” 。借助利用
data.table等包的高效 R 代码,您可以处理超过 1 亿行数据集,而速度不会成为限制因素。有一个非常好的理由存在高级脚本语言,而且我们并不是每次需要读取 CSV 和图形时都编写 Fortran 例程 - 易用性(稍微权衡一下性能)使 R 成为执行范围广泛的任务的绝佳选择。
标签: r parallel-processing data.table data-mining