Я заметил некоторые проблемы с параллельной обработкой в моей среде, я получил необъяснимые значения NULL в своих списках. Ниже приведен простой пример, который создает NULL.
library(parallel)
print(sessionInfo())
print(paste("Number of cores:", detectCores()))
list_a <- list()
# Assing values from 1 to 100 to the list
for (i in 1:100) {
list_a[i] <- i
}
res <- mclapply(list_a, function(x) {x*x}, mc.cores = 28)
# Print length of list_a, unlist(res) and number of nulls in res
print(paste("Length of the list_a is", length(list_a)))
print(paste("Length of the unlist(res) is", length(unlist(res))))
print(paste("Number of nulls in res is",
sum(unlist(lapply(res, is.null)))))
Ниже приведена печать, когда я запускаю скрипт с помощью Rscript.
pietvil@90113001SR001 $ Rscript --no-init-file mclapplydebug3.R
R version 3.5.1 (2018-07-02)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server release 6.10 (Santiago)
Matrix products: default
BLAS: /usr/lib64/R/lib/libRblas.so
LAPACK: /usr/lib64/R/lib/libRlapack.so
locale:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=en_US.UTF-8 LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_ADDRESS=C LC_TELEPHONE=C
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C
attached base packages:
[1] parallel stats graphics grDevices utils datasets methods
[8] base
loaded via a namespace (and not attached):
[1] compiler_3.5.1
[1] "Number of cores: 56"
[1] "Length of the list_a is 100"
[1] "Length of the unlist(res) is 97"
[1] "Number of nulls in res is 3"
Если я запускаю mclapply, используя 29 ядер, я также получаю следующую ошибку
Error in sendMaster(try(lapply(X = S, FUN = FUN, ...), silent = TRUE)) :
write error, closing pipe to the master
Calls: mclapply -> lapply -> FUN -> sendMaster
Если я использую менее 28 ядер, я не получаю значений NULL. Однако у меня очень трудоемкий скрипт, и я хотел бы использовать как можно больше ядер. Любая идея, что делать?
Edit1: я заметил эту проблему после крупного обновления ОС на наших серверах. У меня сложный цикл mclapply и цикл foreach %dopar%, которые оба начали возвращать неожиданные нулевые значения. Исследуя эту проблему, я заметил, что даже этот простой пример возвращает нулевые значения, и поэтому я разместил его. Даже foreach в этом примере иногда возвращает некоторые нулевые значения в моей среде.
Edit2: я попробовал этот пример на другом сервере (RHEL 7.6), и я не получаю нулевых значений в этой среде.
Edit3: если я снова запускаю res <- mclapply(list_a, function(x) {x*x}, mc.cores = 28)
позже в сценарии, он не всегда выдает NULL, но иногда это происходит.
foreach()
? - person F. Privé   schedule 02.01.2019