разные результаты с использованием одного ядра и нескольких ядер для изменения data.table - PullRequest
1 голос
/ 27 сентября 2019

Я нашел что-то очень запутанное, когда я использую множественную обработку для изменения значений в R. data.table.

Я пытался изменить значение на месте с помощью функции.Он работает хорошо, используя одно ядро, и значения в data.table были успешно изменены.Но когда я использовал несколько ядер, мне не удалось изменить значение в data.table.

Это очень смущает меня.Кто-нибудь знает почему?

library(data.table)
library(parallel)
aa <- as.data.table(iris)
aa[,tt:=0]
# modify aa$tt in place
main <- function(x){
  #set(aa,x,6L,5)
  aa[x,tt:=5]
  return(NULL)
}

# aa$tt changed
mclapply(1:nrow(aa), main, mc.cores = 1)

# aa$tt unchanged
mclapply(1:nrow(aa), main, mc.cores = 2)

1 Ответ

0 голосов
/ 27 сентября 2019

Краткий ответ: Параллельные подпроцессы работают с копиями aa.

Более длинный ответ:

mclapply использует разветвленный "sub "процессы (= в основном копии * родительского процесса) и, следовательно, работают с скопированными данными (aa в вашем случае).

Это означает, что изменения aa в подпроцессе делают не изменить aa в основном процессе.

Подробнее см. ?parallel::mclapply, например.как использовать конечный результат, который является возвращаемым значением (!).

*) Фактически в Linux разветвление реализовано с использованием страниц памяти копирования при записи для повышения производительности

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