Сбой mclapply с data.table

В настоящее время я столкнулся со странной ситуацией с циклом, который я распараллеливаю, используя mclapply.

Параллельные вызовы иногда возвращают NULL с помощью mclapply, но все работает, когда я использую lapply.

С mclapply все также работает хорошо, но только если я не использую data.table для поднабора в вызываемой функции.

У меня пока нет разумного mve, что я мог бы опубликовать здесь, но мог бы предоставить код по запросу.

Упрощенная общая структура выглядит следующим образом:

foo <- function(d) { # d is a data.table
    unlist(mclapply(1:nrow(d), function(i) bar(d[-i])))
}


bar <- function(d) {    
    ...
    ## this version fails:
    pdists <- lapply(unique(d$comp),
                     function(cc) dist(d[d$comp==cc,.(X,Y)]))
    ## this also fails:
    pdists <- lapply(unique(d$comp),
                     function(cc) dist(d[cc, .(X,Y), on="comp"]))
    ## this way it works:
    pdists <- lapply(unique(d$comp),
                     function(cc) dist(d[d$comp==cc,c("X","Y")]))
    ...
}

При просмотре того, что возвращает mclapply и проверке, какие элементы имеют значение NULL, я получаю:

  write error, closing pipe to the master
  [1] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE TRUE FALSE
 [13] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE TRUE FALSE
 [25] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE TRUE FALSE
...
[337] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE TRUE FALSE
[349] FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE TRUE FALSE

Это почти похоже на то, что один из четырех потоков умирает (я использую mc.cores=4).

Есть ли проблемы с безопасностью потоков в data.table?

(Я воспроизвел проблему на двух разных компьютерах)

> sessionInfo()                                                                                                                                           
R version 3.5.2 (2018-12-20)                                                                                                                              
Platform: x86_64-pc-linux-gnu (64-bit)                                                                                                                    
Running under: Ubuntu 18.04.2 LTS                                                                                                                         

Matrix products: default                                                                                                                                  
BLAS: /usr/lib/x86_64-linux-gnu/atlas/libblas.so.3.10.3                                                                                                   
LAPACK: /usr/lib/x86_64-linux-gnu/atlas/liblapack.so.3.10.3                                                                                               

locale:                                                                                                                                                   
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C                                                                                                              
 [3] LC_TIME=en_DK.utf8         LC_COLLATE=en_US.UTF-8                                                                                                    
 [5] LC_MONETARY=de_CH.UTF-8    LC_MESSAGES=en_US.UTF-8                                                                                                   
 [7] LC_PAPER=de_CH.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=de_CH.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] data.table_1.12.0

загружается через пространство имен (и не присоединяется): [1] compiler_3.5.2 tools_3.5.2

0 ответов

Не имея доступа к вашей таблице data.table, я думаю, ваша проблема в том, что distне работает для некоторых групп (возможно, они слишком малы), и что все другие группы, назначенные одному и тому же ядру, "испорчены" одной группой, возвращающей ошибку, как и задокументированное поведение mclapply, как более подробно описано в /questions/16699685/mclapply-stalkivaetsya-s-oshibkami-v-zavisimosti-ot-identifikatora-yadra/55232587#55232587.

Другие вопросы по тегам