函数的并行编程使用R

时间:2017-07-23 09:26:02

标签: r apply lapply sapply mapply

我在相似性度量包中有一个名为DTW的函数。它需要两个矩阵或数据框作为其参数,并返回动态时间扭曲距离。那些数据帧是轨迹的经度和纬度。 我的程序看起来像这样,所有数据框如df1,df2,df3等都可用:

distance <- function(arg1,arg2) {
  DTW(arg1, arg2)
}
for(i in 1:length(LIST)){
  for(j in 1:length(LIST)){
    a <- get(paste0("df",i))
    b <- get(paste0("df",j)) 
    ddist[i,j] <- distance(a,b)
    print(ddist)
  }
}

我正在创建一个矩阵ddist,其中所有值都是由distance函数返回的。该计划工作正常。我想快速使用并行编程,如parapply或parlapply函数。

1 个答案:

答案 0 :(得分:0)

这是一个简单的方法,让您了解如何使其并行

  k<-length(LIST)
 ddist<-matrix(0,k,k) 
library("doParallel")
cl<-makeCluster(4,outfile='')
registerDoParallel(cl)
for(i in 1:k) {
  a <- get(paste0("df",i))
  ddist[i,]=foreach(j = 1:k , .combine='cbind' ,.export=paste0("df",1:k)) %dopar% {
    b <- get(paste0("df",j)) 
    distance(a,b)
  }
}

stopCluster(cl)

说完了,要评估的事情

  1. 如果距离函数需要2秒以上,那么只能使用 并行
  2. df1,df2等可能不是一个好主意,存储每个 数据帧为df [[1]],df [[2]]。比使用get函数更好
  3. 如果长度(k)非常大,那么所需的时间量 因此,转移导出的df1,df2等是相当长的时间 尝试通过各种迭代达到性能的最佳点
  4. 您可以看到data.table的选项,其中有inplace编辑, 使用它代替ddist,因为它可能更快
  5. 如果在函数中调用此代码,那么您可能还需要 导出函数ddist,如.export=c(ddist,paste0("df",1:k))
  6. 更改&#34; 4&#34;在makeCluster中选择你想要的核心,作为 thumbrule,保持为detectCores()-1