Подтвердить что ты не робот

Разгрузка 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, чтобы возобновить его в дочернем процессе?

4b9b3361

Ответ 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