我正在处理大量激光雷达数据(>4TB 价值),并且我正在使用
lascatalog
包在 LidR
上运行高度归一化函数。我已使用 job::job()
将其作为后台作业运行。
我的代码如下(请注意,这不是一个
lidR
问题):
las_dir <- "path/to/.las/files/"
las_cat <- readLAScatalog(las_dir, filter = "-drop_overlap -drop_class 6 7 9 13 14 15 16 17 18 0 -keep_random_fraction 0.1")
# Creating height normalise function using k-nearest neighbour inverse distance weighting
norm_height_knnidw <- function(chunk) {
las <- readLAS(chunk)
if (lidR::is.empty(las)) return(NULL)
las <- normalize_height(las, algorithm = knnidw())
}
# Defining las catalog parameters for height normalisation
opt_chunk_size(las_cat) <- 250
opt_chunk_buffer(las_cat) <- 5
opt_output_files(las_cat) <- paste0(tempdir(), "{XLEFT}_normed", overwrite = TRUE)
opt_stop_early(las_cat) <- FALSE
opt <- list(automerge = TRUE)
job::job(las_normed = {
options(mc.cores = 16) #on a high powered computer with 24 cores
# Running height normalisation function on las catalog
catalog_apply(las_cat, norm_height_knnidw, .options = opt)
})
运行良好(总共花费了 5 天 9 小时),但输出的是一个环境,当我尝试工作流程中的下一步时,不会与其交互:
> class(las_normed)
[1] "environment"
> str(las_normed)
<environment: 0x00000293a7b4c538>
# starting to define chunk options for next lascatalog process
> opt_output_files(las_normed) <- paste0(las_output, "{*}_dtm_pitfree", overwrite = TRUE)
Error in ctg@chunk_options :
no applicable method for `@` applied to an object of class "environment"
有没有办法可以将其转换为可用变量?还是我在
job
的初始设置中错过了一个步骤?我尝试阅读job
文档这里,但我很难理解我哪里出了问题/如何与输出交互。我还完成了 Hadley Wickham 的《Advanced R》中的第 7 章:环境,但我仍然在努力理解如何使用环境输出(我完全承认对环境对象的有限理解可能是造成这种情况的原因,所以任何方向非常欢迎更多关于他们的建议)。
您没有在
job::job
调用中进行任何分配,因此没有变量保存到 las_normed
环境中(除了 .jobcode
(以及 .Random.seed
,如果 catalog_apply
使用随机数))。我猜你想要的是这样的:
job::job(las_normed = {
options(mc.cores = 16) #on a high powered computer with 24 cores
# Running height normalisation function on las catalog
res = catalog_apply(las_cat, norm_height_knnidw, .options = opt)
})
完成后,
las_normed
环境将包含对象res
。
我会冒险陈述显而易见的事情,并建议您使用更便宜的操作进行实验
job::job
,直到您确信您知道它的行为方式然后使用它执行多天操作。