我想用rJava
结合mcparallel
但显然JVM 无法被 fork https://stat.ethz.ch/pipermail/r-devel/2013-November/067960.html。因此,需要为每个子进程启动一个单独的 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 以便在子进程中重新启动它吗?