【发布时间】:2020-12-04 17:53:37
【问题描述】:
我试图了解如何在 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)
所以这行不通。我理解逻辑,为什么它不起作用。 我现在的问题是:假设我有一个包含 2 个栅格的栅格堆栈。我可以使用 mclapply 或并行包中的其他函数来以不同的方式编写此过程。所以我同时获得了两个网格的块值,但这些值只写入每个核心的一个评估者。
对于我正在寻找的解决方案,首先获取所有值,将它们安全地保存在一个对象中然后逐块写入值是不可接受的,因为我的栅格太大。
如果有人有解决方案或只是一个想法或建议,我会非常高兴。 谢谢。
【问题讨论】:
标签: r parallel-processing raster r-raster mclapply