【问题标题】:cluster r script isn't reading in RData datasets properly集群 r 脚本未正确读取 RData 数据集
【发布时间】:2014-06-05 00:41:04
【问题描述】:

我正在尝试在我们的集群上运行此作业,但我不断收到“'closure' 类型的对象不是子集”错误。它基本上在一堆节点上运行这个函数“do_1()”。我要设置子集的闭包对象称为“数据”,所以我认为这意味着 RData 文件没有在每个节点上读取(将这些单独的数据集中的每一个称为“数据”可能不是最佳实践,所以这是我的错) .

我将脚本尽可能地简化为基本内容,并显示在下方。当我提交作业时,它仍然会产生相同的错误。我认为在每个节点上读取单独的数据集时我不知道一些事情......我可能在调用 load() 时没有指定一些参数。也许“数据”数据集不在正确的名称空间或其他东西中……我不确定。任何想法将不胜感激。

library(parallel)
library(Rmpi)

np <- mpi.universe.size()
cl <- makeCluster(np, type = "MPI")

allFiles <- list.files("/bigtmp/trb5me/rdata_files/")
allFiles <- sapply(allFiles, function(string) paste("/bigtmp/trb5me/rdata_files/", string, sep = ""))

run_one_day <- function(daynum){

  # do we want to subset days to not the first hour?
  train <- data[[daynum]] * 10000
  train
}
clusterExport(cl = cl, "run_one_day")

do_1 <- function(path_to_file){

  if(!require(xts)){
    install.packages("xts")
    library(xts)
  }

  # load data
  load(file=path_to_file)

  # extract the symbol name so we cna save the results later
  symbolName <- strsplit(path_to_file, "/")[[1]][5]
  symbolName <- strsplit(symbolName, ".", fixed = T)[[1]][1]

  # get the results
  # there is also a function called data...so in this case it's length will be 1
  mySequence <- 1:(length(data)-1)
  myResults <- lapply(mySequence, run_one_day)   #this is where the problem is! 

  # save the results
  path_dest <- paste("/bigtmp/trb5me/mod1_results/", symbolName, ".RData", sep = "")
  save(myResults, file = path_dest)

  # remove everything from memory
  rm(list=ls())

}

parLapply(cl, allFiles, do_1)

# turn off all the cluster stuff
stopCluster(cl)
mpi.exit()

【问题讨论】:

  • 该函数中的错误来自哪里?尝试包括选项(错误=回溯)
  • 等等,我明白了;没关系。

标签: r parallel-processing mpi cluster-computing


【解决方案1】:

这是一个作用域问题:“数据”是在“do_1”的本地环境中加载的,它不在“run_one_day”函数的范围内。 R 使用词法作用域,所以重要的是定义“run_one_day”的位置,而不是调用它的位置。

一种解决方案是使用 load "envir" 参数将 "data" 加载到全局环境中:

load(file=path_to_file, envir=.GlobalEnv)

另一种解决方案是在“do_1”函数中定义“run_one_day”。

【讨论】:

    【解决方案2】:

    data 变量仅在主服务器上可用,在从服务器上不可用。 因为还有一个函数叫做data,这就是他们尝试使用的, 并用[[ 对其进行子集化会给出您收到的错误消息。

    在计算之前尝试将data 变量导出到其他节点。

    clusterExport(cl, "data")
    

    【讨论】:

    • 即使在每个节点上都调用了“load()”,它也只能在主节点上使用?这意味着不能在不同的节点上加载不同的 RData 文件。这是真的吗?
    • @Taylor load 将数据放在do_1 的环境中,run_one_day 无权访问。你最好将它作为参数传递给run_one_day,甚至更好地使用readRDS/saveRDS。
    • 在我看来,“数据”变量仅在工作人员上可用,因为它由“do_1”函数加载,该函数仅通过 parLapply 在工作人员上执行。 clusterExport 在这种情况下没有意义。
    • @SteveWeston:你是对的:因为在任何地方都没有data &lt;-,所以我假设该变量是在之前的某个地方定义的。我也更喜欢saveRDS和readRDS:save和load隐藏正在加载的变量的名称。
    【解决方案3】:

    可能是错误的,但看起来错误实际上在train &lt;- data[[daynum]] 中。它试图对 函数 或“闭包”数据进行子集化,当然,还有窃听。尝试将您的数据集命名为“数据”以外的其他名称,看看会发生什么。

    【讨论】:

      猜你喜欢
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-17
      • 2023-04-05
      • 2019-05-19
      相关资源
      最近更新 更多