Состояние гонки с параллельным пакетом в R - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь выполнить функцию с побочным эффектом на вектор параллельно.Например, в следующем фрагменте, add.entry имеет побочный эффект изменения master.

library(parallel)

master <- data.frame()

add.entry <- function(x) {
  row <- data.frame(a = x, b = sin(x))
  master <- rbind(master, row)
}

mclapply(1:42, add.entry)

Вывод, который я получаю,

[[1]] ab1 1 0,841471

[[2]] ab 1 2 0,9092974

[[3]] ab 1 3 0,14112

[[4]] ab 1 4 -0,7568025

Однако, master впоследствии ничего не содержит.Мое лучшее предположение состоит в том, что есть какое-то состояние гонки.Как я могу это исправить, например, объявив критический раздел?

1 Ответ

0 голосов
/ 03 февраля 2019
  1. очень медленно растет объект внутри цикла (ср. https://privefl.github.io/blog/why-loops-are-slow-in-r/).
  2. , когда вы используете параллелизм, вы не rbind() к master в вашей глобальной среде, но для некоторых его копий в разных вилках (ср. https://privefl.github.io/blog/a-guide-to-parallelism-in-r/).
  3. mclapply уже что-то возвращает (например, lapply).

Вы можете просто сделать

library(parallel)

add.entry <- function(x) {
  data.frame(a = x, b = sin(x))
}

res_list <- mclapply(1:42, add.entry)
master <- do.call("rbind", res_list)
...