Сбой 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.