首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用plyr,doMC,并使用非常大的数据集来总结()?

使用plyr,doMC,并使用非常大的数据集来总结()?
EN

Stack Overflow用户
提问于 2011-12-29 14:54:40
回答 1查看 1.3K关注 0票数 7

我有一个相当大的数据集(~1.4m行),我正在对其进行拆分和总结。整个过程需要一段时间才能运行,我的最后一个应用程序取决于频繁运行,所以我的想法是使用doMC.parallel=TRUE标志,类似于plyr (稍微简化了一点):

代码语言:javascript
复制
library(plyr)
require(doMC)
registerDoMC()

df <- ddply(df, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)

如果我将内核的数量显式地设置为两个(使用registerDoMC(cores=2)),我的8GB内存就能让我通过,这就节省了相当长的时间。但是,如果让它使用所有8个内核,我很快就会耗尽内存,因为每个分叉进程似乎都在内存中克隆整个数据集。

我的问题是,是否有可能以更节省内存的方式使用plyr的并行执行工具?我尝试将我的数据转换成一个big.matrix,但这似乎只是迫使整个事情回到使用单个核心:

代码语言:javascript
复制
library(plyr)
library(doMC)
registerDoMC()
library(bigmemory)

bm <- as.big.matrix(df)
df <- mdply(bm, c("cat1", "cat2"), summarize, count=length(cat2), .parallel = TRUE)

这是我第一次尝试多核R计算,所以如果有更好的思考方法,我愿意接受建议。

更新:和生活中的许多事情一样,我在代码的其他地方做了其他愚蠢的事情,在这个特定的例子中,整个多处理的问题变得毫无意义。但是,对于大数据折叠任务,我将记住data.table。我能够以一种简单的方式复制我的折叠任务。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-12-29 15:31:48

我不认为plyr会复制整个数据集。但是,在处理数据块时,会将该子集复制到工作人员。因此,当使用更多的工作人员时,更多的子集同时在内存中(即8而不是2)。

我能想到一些你可以尝试的小窍门:

  • 将数据放入数组结构中,而不是data.frame,并使用它来进行总结。数组在内存使用和速度方面效率要高得多。我的意思是使用正常矩阵,而不是big.matrix。
  • data.table一个尝试,在某些情况下,这可能导致几个数量级的速度增长。我不确定data.table是否支持并行处理,但即使没有并行化,data.table也可能比以前快一倍。请参见比较我的博客文章aveddplydata.table来处理大块数据。
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8669345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档