2017-05-02 36 views
0

在另一篇文章here中,我询问了如何在foreach循环内并行处理对h2o.gbm的调用。R,h2o和foreach:java.lang.IllegalStateException

以下提供的答案,我跑类似于此示例脚本:

library(h2o) 
data(iris) 
data <- as.h2o(iris) 
ss <- h2o.splitFrame(data) 
gbm <- h2o.gbm(x = 1:4, y = "Species", training_frame = ss[[1]]) 
h2o.saveModel(path="some path") 
h2o.shutdown(prompt = FALSE) 

library(foreach) 
library(doParallel) 


#setup parallel backend to use 12 processors 
cl <- makeCluster(12) 
registerDoParallel(cl) 

#loop 
df4 <- foreach(i = seq(20), .combine=rbind) %dopar% { 
library(h2o) 
port <- 54321 + 3*i 
print(paste0("http://localhost:", port)) 
h2o.init(nthreads = 1, max_mem_size = "10G", port = port) #my local machine runs 128GB 
df4 <- data.frame() 
gbm <- h2o.loadModel(path="some path") 
df4 <- as.data.frame(h2o.predict(gbm, ss[[2]]))[,1] 
} 

它运行得很好我的真实数据(比连续至少快50%)

的小样本但是,当我在我所有的数据运行,我得到下面的错误代码后45分钟:

Error in { : task 2 failed - " 

ERROR MESSAGE: 

DistributedException from localhost/127.0.0.1:60984, caused by 
java.lang.IllegalStateException: Unable to clean up RollupStats after an 
exception (see cause). This could cause a key leakage, key=$05ff14000000feffffff$_b66dbd609dc068f0137cc88cb42a 
" 

我不知道是什么原因导致这个错误代码。我想这与内存问题有关,因为这段代码将占用我的RAM(128GB)的85-95%和我的CPU的100%(12线程)。

任何任何想法来解决这个问题?

回答

0

对于那些有兴趣的人,我找到了这个错误的原因。它其实很简单。

使用makeCluster(12)我在CPU上请求12个线程。

后来在foreach调用,我做了一个h2o.init调用,其中我要求另一个线程。

由于我的机器只有12个线程,因此无法正确处理最后一次调用额外的(12 + 1)线程。

我通过给集群分配6个线程来解决这个问题。这让我有6个线程可以对h2o.init进行六次单独呼叫(每个呼叫中​​都有一个呼叫)。

This works great。