Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过并行处理理解光栅的写值。使用McLappy fork群集时是否可以为每个光栅写入值。R_R_Parallel Processing_Raster_R Raster_Mclapply - Fatal编程技术网

通过并行处理理解光栅的写值。使用McLappy fork群集时是否可以为每个光栅写入值。R

通过并行处理理解光栅的写值。使用McLappy fork群集时是否可以为每个光栅写入值。R,r,parallel-processing,raster,r-raster,mclapply,R,Parallel Processing,Raster,R Raster,Mclapply,我试图理解如何在R中并行化光栅处理。我的目标是在多核上用多个光栅并行化以下内容。 我分块处理光栅,并尝试将其与McLappy或其他函数并行。首先,我想得到一个光栅或光栅堆栈的值。然后我想把这些值写入对象。当我使用多核时,它不起作用,因为不同的子进程希望在同一时间写入。有人知道解决办法吗 因此,过程如下: 获取并创建数据 r <- raster(system.file("external/test.grd", package="raster")) s

我试图理解如何在R中并行化光栅处理。我的目标是在多核上用多个光栅并行化以下内容。 我分块处理光栅,并尝试将其与McLappy或其他函数并行。首先,我想得到一个光栅或光栅堆栈的值。然后我想把这些值写入对象。当我使用多核时,它不起作用,因为不同的子进程希望在同一时间写入。有人知道解决办法吗

因此,过程如下:

获取并创建数据

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

r我相信
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
>库(光栅)
>r未来:::断言无引用(r)
NULL##==无外部指针
>s future:::断言没有引用
NULL##==无外部指针
>s future:::断言没有引用
错误:在future表达式中使用的一个全局变量()中检测到不可导出的引用('externalptr')

是的,这正是问题所在。谢谢你讲清楚了。因此,对于分块光栅处理,不可能并行化?唯一的可能是通过在光栅堆栈上循环进行分块光栅处理。在我看来,这将是非常低效的。你还有别的主意吗?对不起,我不知道。我建议联系raster的维护人员,以获得关于使用其数据结构进行并行化的建议。
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)
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)

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)
> 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