2017-05-03 40 views
0

此代码按预期工作:在doMC的foreach和dopar中调用其他包的注意事项是什么?

library(dplyr) 
data <- list(t1 = "hello world.", t2 = "bye world") 

library(doMC) 
registerDoMC(3) 

res <- foreach(t = data) %dopar% { 

    print(sprintf("processing %s", t)) 

    data.frame(text = t) %>% 
    dplyr::count(text) 

} 

print(res) 

然而,这个代码只是打印“处理世界你好”。和“处理再见世界”,然后挂起(没有抛出异常)。上述

library(dplyr) 
coreNLP::initCoreNLP() 

data <- list(t1 = "hello world.", t2 = "bye world") 

library(doMC) 
registerDoMC(3) 

res <- foreach(t = data) %dopar% { 

    print(sprintf("processing %s", t)) 

    coreNLP::annotateString(t)$token 

} 

print(res) 

代码将如预期如果我改变%dopar%%do%

我不明白是什么导致了这种行为。为什么在%dopar%内调用coreNLP函数会导致R挂起,但对其他软件包正常工作?这是否与coreNLP对Java的依赖有关?

这里是sessionInfo()输出:

R version 3.4.0 (2017-04-21) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 16.04.2 LTS 

Matrix products: default 
BLAS: /usr/lib/libblas/libblas.so.3.6.0 
LAPACK: /usr/lib/lapack/liblapack.so.3.6.0 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

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

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 

回答

1

你的第一个例子中工作得很好,我对什么样子了类似的设置。运行该示例后的我的会话信息如下所示;请务必在新的R课程中再次尝试(R --vanilla)。我有四个核心(从parallel::detectCores())。

sessionInfo() 
R version 3.4.0 (2017-04-21) 
Platform: x86_64-pc-linux-gnu (64-bit) 
Running under: Ubuntu 16.04.2 LTS 

Matrix products: default 
BLAS: /usr/lib/atlas-base/atlas/libblas.so.3.0 
LAPACK: /usr/lib/atlas-base/atlas/liblapack.so.3.0 

locale: 
[1] LC_CTYPE=en_US.UTF-8  LC_NUMERIC=C    
[3] LC_TIME=en_US.UTF-8  LC_COLLATE=en_US.UTF-8  
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8 
[7] LC_PAPER=en_US.UTF-8  LC_NAME=C     
[9] LC_ADDRESS=C    LC_TELEPHONE=C    
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C  

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

other attached packages: 
[1] doMC_1.3.4  iterators_1.0.8 foreach_1.4.3 dplyr_0.5.0  

loaded via a namespace (and not attached): 
[1] compiler_3.4.0 magrittr_1.5  R6_2.2.0   assertthat_0.2.0 
[5] DBI_0.6-1  tibble_1.3.0  Rcpp_0.12.10  codetools_0.2-15 

你的第二个例子确实工作对我也。输出如下。我的猜测是,分叉进程可以共享与coreNLP依赖的相同的基础Java进程/服务,而不是而不是;真的不知道coreNLP。

> res <- foreach(t = data) %dopar% { 
+ 
+  print(sprintf("processing %s", t)) 
+ 
+  coreNLP::annotateString(t)$token 
+ 
+ } 
[1] "processing hello world." 
[1] "processing bye world" 


^CError in selectChildren(ac, 1) : 
    Java called System.exit(130) requesting R to quit - trying to recover 
Error during wrapup: C stack usage 591577121812 is too close to the limit 

*** caught segfault *** 
address 0x2, cause 'memory not mapped' 
相关问题