Понимание значений записи растра при параллельной обработке. Можно ли записывать значения для каждого растра при использовании вилочного кластера mclapply. р

Я пытаюсь понять, как распараллелить обработку растров в R. Моя цель состоит в том, чтобы распараллелить следующее на нескольких ядрах с несколькими растрами. Я обрабатываю свой растр поблочно и пытаюсь распараллелить его с помощью mclapply или других функций. Сначала я хочу получить значения одного растра или растрового стека. а затем я хочу записать значения в объект. Когда я использую несколько ядер, это не работает, потому что разные подпроцессы хотят писать одновременно. Кто-нибудь знает решение для этого?

Итак, вот процесс:

получать и создавать данные

r <- raster(system.file("external/test.grd", package="raster"))
s <- raster(r)
tr <- blockSize(r)

затем получить значения и записать значения с помощью цикла for

s <- writeStart(s[[1]], filename='test.grd',  overwrite=TRUE)
for (i in 1:tr$n) {
  v <- getValuesBlock(r, row=tr$row[i], nrows=tr$nrows[i])
  s <- writeValues(s, v, tr$row[i])
}
s <- writeStop(s)

это отлично работает

теперь пробуем то же самое на lapply

s <- writeStart(s[[1]], filename='test.grd',  overwrite=TRUE)
#working with lapply
lapply(1:tr$n, function(x){
  v <- getValues(r, tr$row[x], tr$nrows[x])
  s <- writeValues(s,v,tr$row[x])
})
s <- writeStop(s)

работает отлично

Теперь пробуем mclapply с одним ядром

s <- writeStart(s[[1]], filename='test.grd',  overwrite=TRUE)

#does work with mclapply one core
parallel::mclapply(1:tr$n, function(x){
  v <- getValues(r, tr$row[x], tr$nrows[x])
  s <- writeValues(s,v,tr$row[x])
}, mc.cores = 1)
s <- writeStop(s)

также работает

сейчас пробуем mclapply на нескольких ядрах

s <- writeStart(s[[1]], filename='test.grd',  overwrite=TRUE)
#does not work with multiple core
parallel::mclapply(1:tr$n, function(x){
  v <- getValues(r, tr$row[x], tr$nrows[x])
  s <- writeValues(s,v,tr$row[x])
}, mc.cores = 2)
s <- writeStop(s)

Так что это не работает. Я понимаю логику, почему не работает. Теперь мой вопрос: предположим, у меня есть растровый стек с двумя растрами. Могу ли я использовать mclapply или другую функцию из пакета parallel, чтобы написать этот процесс по-другому. Таким образом, я получаю значения блока для обеих сеток одновременно, но эти значения записываются только одному рейтеру на ядро.

Для решения, которое я ищу, неприемлемо сначала получить все значения, сохранить их в объекте, а затем записать значения поблочно, потому что мои растры слишком велики.

Я был бы очень рад, если у кого-то есть решение или просто идея или предложение. Спасибо.


person Muesgen    schedule 04.12.2020    source источник


Ответы (1)


Я считаю, что объект, возвращаемый raster::writeStart(), может быть обработан только в том же процессе R, в котором он был создан. То есть параллельный процесс R не может работать с ним.

Тот факт, что объект внутри использует внешний указатель, является убедительным признаком того, что его нельзя экспортировать в другой процесс R, сохранить в файл или снова прочитать. Вы можете проверить внешние указатели, используя (непубличные) future:::assert_no_references(), например.

> library(raster)
> r <- raster(system.file("external/test.grd", package="raster"))
> future:::assert_no_references(r)
NULL     ## == no external pointer

> s <- raster(r)
> future:::assert_no_references(s)
NULL     ## == no external pointer

> s <- writeStart(s[[1]], filename='test.grd',  overwrite=TRUE)
> future:::assert_no_references(s)
Error: Detected a non-exportable reference ('externalptr') in one of the globals (<unknown>) used in the future expression
person HenrikB    schedule 04.12.2020
comment
Да, именно в этом проблема. Спасибо, что разъяснили. Значит, для блочной обработки растров распараллеливание невозможно? Единственной возможностью была бы блочная обработка растра путем циклического обхода стека растров. На мой взгляд, это было бы очень неэффективно. У вас есть другая идея? - person Muesgen; 04.12.2020
comment
Извините, я не знаю. Я предлагаю обратиться к сопровождающему raster за рекомендациями по распараллеливанию с использованием их структур данных. - person HenrikB; 05.12.2020