gpt4 book ai didi

r - 使用 plyr、doMC 和 summarise() 处理非常大的数据集?

转载 作者:行者123 更新时间:2023-12-04 12:12:07 54 4
gpt4 key购买 nike

我有一个相当大的数据集(约 1.4m 行),我正在对它进行一些拆分和总结。整个运行需要一段时间,我最终的应用依赖频繁运行,所以我的想法是使用doMC.parallel=TRUE像这样用plyr标记(简化了一点):

library(plyr)
require(doMC)
registerDoMC()

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

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

我的问题是是否可以以更节省内存的方式使用 plyr 的并行执行设施?我尝试将我的数据帧转换为 big.matrix ,但这似乎只是迫使整个事情回到使用单个核心:
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心里。我能够以一种直接的方式复制我的折叠任务。

最佳答案

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

我可以想到一些您可以尝试的提示:

  • 将您的数据放入数组结构而不是 data.frame 并使用 adply 进行汇总。数组在内存使用和速度方面效率更高。我的意思是使用普通矩阵,而不是 big.matrix。
  • data.table尝试一下,在某些情况下,这可能会导致速度提高几个数量级。我不确定 data.table 是否支持并行处理,但即使没有并行化,data.table 也可能快数百倍。见 blog post of mine比较 ave , ddplydata.table用于处理数据块。
  • 关于r - 使用 plyr、doMC 和 summarise() 处理非常大的数据集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8669345/

    54 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com