当串行执行随机林时,它在我的系统上使用8GB的RAM,当并行执行它时,它使用超过两倍的RAM(18GB)。如果并行执行此操作,如何将其保持在8GB?这是代码:
install.packages('foreach')
install.packages('doSMP')
install.packages('randomForest')
library('foreach')
library('doSMP')
library('randomForest')
NbrOfCores <- 8
workers <- startWorkers(NbrOfCores) # number of cores
registerDoSMP(workers)
getDoParName() # check name of parallel backend
getDoParVersion() # check version of parallel backend
getDoParWorkers() # check number of workers
#creating data and setting options for random forests
#if your run this please adapt it so it won't crash your system! This amount of data uses up to 18GB of RAM.
x <- matrix(runif(500000), 100000)
y <- gl(2, 50000)
#options
set.seed(1)
ntree=1000
ntree2 <- ntree/NbrOfCores
gc()
#running serialized version of random forests
system.time(
rf1 <- randomForest(x, y, ntree = ntree))
gc()
#running parallel version of random forests
system.time(
rf2 <- foreach(ntree = rep(ntree2, 8), .combine = combine, .packages = "randomForest") %dopar% randomForest(x, y, ntree = ntree))
答案 0 :(得分:3)
首先,SMP将复制输入,以便每个进程都可以获得自己的副本。这可以通过使用multicore
进行转义,但还有另一个问题 - randomForest
的每次调用也会生成输入的内部副本。
最好的做法是通过让randomForest
删除森林模型本身(使用keep.forest=FALSE
)并进行测试以及培训(使用xtest
和可能{来减少一些用法) {1}}参数)。
答案 1 :(得分:1)
随机林对象可能会因中等大小的数据集而变得非常大,因此增加可能与存储模型对象有关。
要测试这个,你应该有两个不同的会话。
尝试并行运行另一个没有大占用空间的模型(例如lda),看看你是否得到了相同的内存增长。
答案 2 :(得分:0)
我认为发生的事情如下。当您的父进程生成子进程时,内存将被共享,即ram使用率不会显着增加。但是,当子进程开始构建随机林时,它们会创建许多新的中间对象,这些对象不在共享内存中,并且可能相当大。
所以我的答案是,令人失望的是,可能没有简单的方法,至少使用randomForest包 - 尽管如果有人知道的话,我会非常感兴趣。