将plyr、doMC和Summary()用于非常大的数据集?
我有一个相当大的数据集(约140万行),我正在对其进行拆分和汇总。整个过程需要一段时间才能运行,而我的最终应用程序依赖于频繁运行,因此我的想法是使用将plyr、doMC和Summary()用于非常大的数据集?,r,plyr,data.table,R,Plyr,Data.table,我有一个相当大的数据集(约140万行),我正在对其进行拆分和汇总。整个过程需要一段时间才能运行,而我的最终应用程序依赖于频繁运行,因此我的想法是使用doMC和带有plyr的.parallel=TRUE标志,就像这样(简化了一点): 这是我第一次涉足多核R计算,所以如果有更好的方法来思考这个问题,我愿意接受建议 更新:与生活中的许多事情一样,事实证明我在代码的其他地方做了其他愚蠢的事情,而在这个特定的例子中,整个多处理问题变得毫无意义。然而,对于大数据折叠任务,我会记住data.table。我能够
doMC
和带有plyr的.parallel=TRUE
标志,就像这样(简化了一点):
这是我第一次涉足多核R计算,所以如果有更好的方法来思考这个问题,我愿意接受建议
更新:与生活中的许多事情一样,事实证明我在代码的其他地方做了其他愚蠢的事情,而在这个特定的例子中,整个多处理问题变得毫无意义。然而,对于大数据折叠任务,我会记住
data.table
。我能够以一种简单的方式复制我的折叠任务。我认为plyr不会复制整个数据集。但是,在处理数据块时,该子集将复制到辅助对象。因此,当使用更多的worker时,内存中同时存在更多的子集(即8而不是2)
我可以想出一些你可以尝试的技巧:
- 将数据放入数组结构而不是data.frame,并使用adply进行汇总。阵列在内存使用和速度方面效率更高。我的意思是使用正规矩阵,而不是大矩阵
- 尝试一下
,在某些情况下,这会导致速度提高几个数量级。我不确定data.table是否支持并行处理,但即使没有并行化,data.table也可能快几百倍。请参阅比较data.table
、ave
和ddply
,了解数据块的处理李>data.table
library(plyr)
require(doMC)
registerDoMC()
df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)
library(plyr)
library(doMC)
registerDoMC()
library(bigmemory)
bm <- as.big.matrix(df)
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)