cluster r脚本无法正确读取RData数据集

时间:2014-04-21 00:25:08

标签: r parallel-processing mpi cluster-computing

我正在尝试在我们的集群上运行这个工作,并且我一直得到这个“类型'对象'的对象'不是子集”错误。它基本上在一堆节点上运行这个函数“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()

3 个答案:

答案 0 :(得分:2)

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

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

load(file=path_to_file, envir=.GlobalEnv)

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

答案 1 :(得分:0)

可能是错误的,但看起来错误实际上在train <- data[[daynum]]。它正在尝试将函数或“闭包”数据进行子集化,当然还有一些问题。尝试将数据集命名为“数据”之外的其他内容,看看会发生什么。

答案 2 :(得分:0)

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

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

clusterExport(cl, "data")