Отправка фрагментов большого набора данных на определенные ядра для R parallel foreach

Я пытаюсь масштабировать скрипт, который включает применение функции извлечения признаков к файлу изображения, сгенерированному с использованием данных из каждой строки 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, поэтому разветвление для меня не вариант.


person Dan Woodrich    schedule 22.08.2019    source источник
comment
Если вы работаете с матрицами (а не с фреймами данных), возможно, вам стоит взглянуть на матрицы на диске (упрощает параллелизм). Посмотрите на пакеты {bigmemory} и {bigstatsr}.   -  person F. Privé    schedule 23.08.2019
comment
Спасибо @F.Privé, что направил меня на правильный путь. Я работаю с матрицами, но кадры данных, вероятно, возможны, просто сохраняя фрагменты ваших данных на диске в виде разных файлов .csv, а затем загружая их в каждое ядро. Я думаю, что файлы bigmemory сжаты и поэтому, вероятно, намного эффективнее, но если дисковое пространство не имеет большого значения, это может быть решением.   -  person Dan Woodrich    schedule 30.10.2019
comment
Я не думаю, что файлы {bigmemory} сжаты. Это просто бинарные файлы, хранящие каждый элемент матрицы по порядку.   -  person F. Privé    schedule 30.10.2019