mclapply возвращает значения NULL в простом примере - PullRequest
0 голосов
/ 02 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...