卸载rJava和/或重新启动JVM

我想将rJavamcparallel结合使用,但显然JVM不能分叉 。 因此,需要为每个子进程启动单独的JVM实例,例如:

 library(rJava) library(parallel) myfile <- system.file("tests", "test_import.xlsx", package = "xlsx") #This works: mccollect(mcparallel({ #Automatically initiates JVM in child xlsx::read.xlsx(myfile, 1) })) 

但是我的问题是JVM已经在(主)父进程中启动了。 这使得在子进程中无法使用rJava

 #init JVM in parent .jinit() #Doesn't work anymore mccollect(mcparallel({ xlsx::read.xlsx(myfile, 1) })) 

所以我真正需要的是在子进程中关闭/终止和重启JVM的方法。 简单地detach("package:rJava", unload = TRUE)似乎没有做到这一点。 force.init参数似乎也没有导致重启:

 #Also doesn't work: .jinit() mccollect(mcparallel({ .jinit(force.init = TRUE) xlsx::read.xlsx(myfile, 1) })) 

有没有什么方法可以强制关闭/杀死JVM以便在子进程中重新启动它?

有一种方法可以使用rJava并行运行表达式,这是基于运行并行进程来获取和组装所有结果之前在主进程中加载​​rJava库之前 。 由于主R进程尚未启动jvm,因此java在每个单个子进程中启动,并且此特定实例也将与子进程一起死亡。

 # Rsession started library(parallel) myfile <- system.file("tests", "test_import.xlsx", package = "xlsx") e <- expression({ require(rJava) require(xlsx) read.xlsx(myfile, 1) }) p <- mcparallel(e) q <- mcparallel(e) pq <- mccollect(list(p, q)) # again to check reproducibility p <- mcparallel(e) q <- mcparallel(e) pq2 <- mccollect(list(p, q)) identical(unname(pq),unname(pq2)) # see the result if it is the right content and not tryerr pq # now the main continues ... # and if necessary even load rJava 
Interesting Posts