Разгрузка rJava и/или перезапуск JVM
Я хотел бы использовать rJava
в комбинации с mcparallel
, но, очевидно, 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, чтобы возобновить его в дочернем процессе?
Ответы
Ответ 1
Существует способ запуска выражений с использованием 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