Я пытаюсь масштабировать скрипт, который включает применение функции извлечения признаков к файлу изображения, сгенерированному с использованием данных из каждой строки R-матрицы. Для более быстрого вычисления я разбиваю матрицу на фрагменты одинакового размера и запускаю каждый фрагмент в R parallel
, используя структуру foreach
. Для этого я должен отправить всю матрицу на каждое ядро с помощью clusterExport
и подмножить ее на нужный фрагмент в цикле foreach
.
Я надеюсь найти способ экспортировать только фрагменты матрицы в каждое ядро, вместо того, чтобы передавать полную матрицу в каждое ядро, а затем подмножество. Мне удалось найти только один поток, близкий к тому, что я искал: «>этот ответ Стива Уэстона, который отправил отдельные фрагменты на каждое ядро, используя clusterCall
(код вставлен ниже)
library(parallel)
cl <- makeCluster(detectCores())
df <- data.frame(a=1:10, b=1:10)
ix <- splitIndices(nrow(df), length(cl))
for (i in seq_along(cl)) {
clusterCall(cl[i], function(d) {
assign('mydata', d, pos=.GlobalEnv)
NULL # don't return any data to the master
}, df[ix[[i]],,drop=FALSE])
}
Этот ответ сработал, как и было заявлено, однако ядра в этом примере работают последовательно, а не параллельно. Моя попытка распараллелить это с использованием foreach
вместо for
потерпела неудачу из-за необходимости использовать clusterExport
для передачи переменной набора данных, что является проблемой, которую я пытаюсь избежать.
clusterExport(cl,c("df","ix"))
foreach() %dopar% {etc}
Есть ли способ передать куски переменной каждому ядру и работать с ними параллельно? Было бы неплохо использовать решение foreach или параллельную адаптацию к структуре Стива Уэстона. Обратите внимание, что я разрабатываю для Windows, поэтому разветвление для меня не вариант.