Я заметил некоторые проблемы с параллельной обработкой в моей среде, я получил необъяснимые значения 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, но иногда это так.