我以前使用以下代码处理LIDAR目录(在greatLedR软件包中使用lascatalog函数:]
library(lidR)
lasdir <- "D:\\LAS\\"
output <- "D:\\LAS\\PRODUCTS\\"
epsg = "+init=epsg:25829"
res = 1
no_cores <- detectCores()
cat <- lascatalog(lasdir = lasdir,
outputdir = output,
pattern = '*COL.laz$|*COL.LAZ$',
catname = "Catalog",
clipcat = FALSE, clipcatbuf = FALSE, clipbuf = 1000, clipcatshape = clipcatshape,
cat_chunk_buffer = 20,
cores = no_cores, progress = TRUE,
laz_compression = TRUE, epsg = epsg,
retilecatalog = FALSE, tile_chunk_buffer = 10,
tile_chunk_size = 1000,
filterask = FALSE,
filter = "-keep_first -drop_z_below 2")
DEM_output <- paste0(output,"DEM_", str_pad(res, 3, "left", pad = "0"), "/")
opt_output_files(cat) <- paste0(DEM_output,"{ORIGINALFILENAME}") #set filepaths
DEM <- grid_terrain(cat, res = res, algorithm = "knnidw"(k = 5, p = 2))
这是因为该库已有一些实现,现在,参数“ cores”似乎不起作用,尽管该过程有效,但现在它不能并行运行。这是我收到的消息:不再支持选项。参见?lidR-parallelism
。
我现在可以并行处理目录吗?
这里您可以下载包含一些LAS数据的文件夹以尝试:https://drive.google.com/open?id=1KTMt_PCdflNqmvMhvXsoV5V2V5cxRo4k
自lidR 2.1.0
(2019年7月起)以来,opt_core()
功能已被弃用。参见changelog。
现在必须由用户明确声明用于并行处理切片的策略。无论如何,这应该是从一开始就应该设计的!对于用户而言,恢复以前的确切行为仅意味着一项更改。
在版本<2.1.0中,以下是正确的:
library(lidR) ctg <- catalog("folder/") opt_cores(ctg) <- 4L hmean <- grid_metrics(ctg, mean(Z))
在版本> = 2.1.0中,必须在将来的程序包中明确声明:
library(lidR) library(future) plan(multisession) ctg <- catalog("folder/") hmean <- grid_metrics(ctg, mean(Z))
此外,这在名为lidR-parallelism
的手册页中也有完整说明。
?lidR::`lidR-parallelism`
基于块的并行性
[当处理LAScatalog时,内部引擎将数据集分成多个块,每个块在循环中依次读取和处理。但是实际上,此循环可以与将来的程序包并行化。通过默认,这些块将被顺序处理,但是可以通过注册评估策略来并行处理它们。例如,以下代码按顺序进行评估:
ctg <- readLAScatalog("folder/") out <- grid_metrics(ctg, mean(Z))
但是此评估与两个核心并行进行:
library(future) plan(multisession, workers = 2L) ctg <- readLAScatalog("folder/") out <- grid_metrics(ctg, mean(Z))
使用基于块的并行性,可以通过处理数据集的几个子集来并行化任何算法[...
为了充分利用此新语法,您需要学习future
的工作方式。参见future。