gpt4 book ai didi

r - Ubuntu下R中的多核和内存使用

转载 作者:太空宇宙 更新时间:2023-11-03 16:41:22 24 4
gpt4 key购买 nike

我在具有 8 个虚拟内核和 8 Gb 内存的 Ubuntu 工作站上运行 R。我希望经常使用多核包来并行使用 8 个内核;但是我发现整个 R 过程重复了 8 次。由于 R 实际上似乎使用了比 gc 中报告的更多的内存(5 倍,即使在 gc() 之后),这意味着即使是相对温和的内存使用(一个 200Mb 对象)一旦重复 8 次也会变得难以处理的内存占用.我查看了 bigmemory 让子进程共享相同的内存空间;但它需要对我的代码进行一些重大的重写,因为它不处理数据帧。

有没有办法让 R 在 fork 之前尽可能精简,即让操作系统回收尽可能多的内存?

编辑:我想我明白现在发生了什么。问题出在我认为的地方——存在于父线程中且未被操作的对象不会被复制八次。相反,我认为我的问题来自于我让每个子进程执行的操作的性质。每个人都必须操纵一个具有数十万个级别的大因素,我认为this是内存密集型位。结果,确实是整体内存负载与核心数成正比的情况;但没有我想象的那么戏剧化。我学到的另一个教训是,有 4 个物理内核 + 超线程的可能性,超线程实际上通常不是 R 的好主意。 yield 很小,内存成本可能不小。所以从现在开始我将致力于 4 核。

对于那些想要试验的人,这是我运行的代码类型:

# Create data
sampdata <- data.frame(id = 1:1000000)
for (letter in letters) {
sampdata[, letter] <- rnorm(1000000)
}
sampdata$groupid = ceiling(sampdata$id/2)

# Enable multicore
library(multicore)
options(cores=4) # number of cores to distribute the job to

# Actual job
system.time(do.call("cbind",
mclapply(subset(sampdata, select = c(a:z)), function(x) tapply(x, sampdata$groupid, sum))
))

最佳答案

你试过了吗data.table

> system.time(ans1 <- do.call("cbind",
lapply(subset(sampdata,select=c(a:z)),function(x)tapply(x,sampdata$groupid,sum))
))
user system elapsed
906.157 13.965 928.645

> require(data.table)
> DT = as.data.table(sampdata)
> setkey(DT,groupid)
> system.time(ans2 <- DT[,lapply(.SD,sum),by=groupid])
user system elapsed
186.920 1.056 191.582 # 4.8 times faster

> # massage minor diffs in results...
> ans2$groupid=NULL
> ans2=as.matrix(ans2)
> colnames(ans2)=letters
> rownames(ans1)=NULL

> identical(ans1,ans2)
[1] TRUE

你的例子很有趣。它相当大(200MB),有很多组(1/2 百万),每个组都非常小(2 行)。 191s 可能可以改进很多,但至少这是一个开始。 [2011 年 3 月]


现在,这个习语(即 lapply(.SD,...))已经有了很大的改进。使用 v1.8.2,在比上述测试更快的计算机上,使用最新版本的 R 等,这是更新后的比较:

sampdata <- data.frame(id = 1:1000000)
for (letter in letters) sampdata[, letter] <- rnorm(1000000)
sampdata$groupid = ceiling(sampdata$id/2)
dim(sampdata)
# [1] 1000000 28
system.time(ans1 <- do.call("cbind",
lapply(subset(sampdata,select=c(a:z)),function(x)
tapply(x,sampdata$groupid,sum))
))
# user system elapsed
# 224.57 3.62 228.54
DT = as.data.table(sampdata)
setkey(DT,groupid)
system.time(ans2 <- DT[,lapply(.SD,sum),by=groupid])
# user system elapsed
# 11.23 0.01 11.24 # 20 times faster

# massage minor diffs in results...
ans2[,groupid:=NULL]
ans2[,id:=NULL]
ans2=as.matrix(ans2)
rownames(ans1)=NULL

identical(ans1,ans2)
# [1] TRUE


sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-pc-mingw32/x64 (64-bit)

locale:
[1] LC_COLLATE=English_United Kingdom.1252 LC_CTYPE=English_United Kingdom.1252
[3] LC_MONETARY=English_United Kingdom.1252 LC_NUMERIC=C
[5] LC_TIME=English_United Kingdom.1252

attached base packages:
[1] stats graphics grDevices datasets utils methods base

other attached packages:
[1] data.table_1.8.2 RODBC_1.3-6

关于r - Ubuntu下R中的多核和内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5109015/

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