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