如何将 R 中的 job::job() 输出作为变量而不是环境来访问?

问题描述 投票:0回答:1

我正在处理大量激光雷达数据(>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 章:环境,但我仍然在努力理解如何使用环境输出(我完全承认对环境对象的有限理解可能是造成这种情况的原因,所以任何方向非常欢迎更多关于他们的建议)。

r parallel-processing rstudio jobs
1个回答
0
投票

您没有在

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
,直到您确信您知道它的行为方式然后使用它执行多天操作。

© www.soinside.com 2019 - 2024. All rights reserved.