В настоящее время я разрабатываю пакет R, который будет использовать параллельные вычисления для решения некоторых задач с помощью «параллельного» пакета.
Я получаю действительно неудобное поведение при использовании кластеров, определенных внутри функций моего пакета, где функция parLapply назначает задание работнику и ожидает его завершения, чтобы назначить задание следующему исполнителю. Или, по крайней мере, это то, что кажется происходящим при просмотре файла журнала «cluster.log» и списка запущенных процессов в оболочке unix.
Ниже представлен макет исходной функции, объявленной внутри моего пакета:
.parSolver <- function( varMatrix, var1 ) {
no_cores <- detectCores()
#Rows in varMatrix
rows <- 1:nrow(varMatrix[,])
# Split rows in n parts
n <- no_cores
parts <- split(rows, cut(rows, n))
# Initiate cluster
cl <- makePSOCKcluster(no_cores, methods = FALSE, outfile = "/home/cluster.log")
clusterEvalQ(cl, library(raster))
clusterExport(cl, "varMatrix", envir=environment())
clusterExport(cl, "var1", envir=environment())
rParts <- parLapply(cl = cl, X = 1:n, fun = function(x){
part <- rasterize(varMatrix[parts[[x]],], raster(var1), .....)
print(x)
return(part)
})
do.call(merge, rParts)
}
ПРИМЕЧАНИЯ:
- Я использую makePSOCKcluster, потому что хочу, чтобы код запускался как в системах Windows, так и в системах Unix, хотя эта конкретная проблема проявляется только в системе unix.
- Функции растеризации и растра определены в библиотеке (растре), экспортируемой в кластер.
Для меня странно то, что если я выполняю один и тот же код функции parSolver в глобальной среде, все работает плавно, все рабочие берут на себя одну работу одновременно, и задача выполняется в кратчайшие сроки. Однако, если я сделаю что-то вроде:
library(myPackage)
varMatrix <- (...)
var1 <- (...)
result <- parSolver(varMatrix, var1)
появляется описанная проблема.
Это, похоже, проблема с балансировкой нагрузки, однако это не объясняет, почему она работает нормально в одной ситуации, а не в другой.
Я что-то упустил? Заранее спасибо.
cl
в своюparSolver(varMatrix, var1, cl)
функцию и используйтеn <- length(cl)
внутри своей функции. - person Sébastien Rochette   schedule 07.04.2017