2012-01-08 4 views
7

При выполнении случайного леса в последовательном режиме он использует 8 ГБ оперативной памяти в моей системе, при параллельном использовании он использует более чем в два раза большую RAM (18 ГБ). Как я могу сохранить его до 8 ГБ при параллельном выполнении? Вот код:Параллельные случайные леса с doSMP и foreach значительно увеличивают использование памяти (в Windows)

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

Я думаю, что произойдет следующее. Поскольку ваш родительский процесс порождает дочерние процессы, память является общей, т. Е. Не происходит значительного увеличения использования плунжера. Однако, когда дочерние процессы начинают создавать случайные леса, они создают много новых промежуточных объектов, которые не находятся в общей памяти и потенциально достаточно велики.

Так что мой ответ заключается в том, что есть, к сожалению, нелегкий путь, по крайней мере, с использованием пакета randomForest - хотя мне было бы очень интересно, если кто-то знал об этом.

1

Случайные объекты леса могут быть очень большими с наборами данных умеренного размера, поэтому увеличение может быть связано с хранением объекта модели.

Чтобы проверить это, у вас должно быть действительно два разных сеанса.

Попробуйте запустить другую модель параллельно, которая не имеет большого размера (например, lda) и проверьте, не увеличилось ли вы в памяти.

3

Прежде всего, SMP будет дублировать ввод, чтобы каждый процесс получил свою собственную копию. Это можно избежать, используя multicore, но есть еще одна проблема: каждый вызов randomForest также сделает внутреннюю копию ввода.

Лучшее, что вы можете сделать это, чтобы сократить некоторые использования, делая randomForest уронить модель леса сама (с keep.forest=FALSE) и делать тестирование наряду с обучением (с использованием xtest и, возможно, ytest аргументы).

+0

Хорошее предложение, но мне нужна модель леса, чтобы иметь возможность делать прогнозы в будущем (т. Е. Мне нужно построить модель сейчас и забить новые данные позже). Что касается многоядерного пакета: это только для Unix (и я нахожусь в Windows, см. Мой вопрос). – user1134616

+0

@ user1134616 Если это так, вы можете полагаться только на не-R случайных реализаций леса ... – mbq