R - 如何并行化我的mergesort

时间:2016-07-23 04:47:10

标签: r sorting parallel-processing

我正在尝试让我的合并成为parallel而不是R中的顺序,我试图使用并行库,但它不起作用(我不知道如何使用它,试图把它合并其中的函数,但不适用于我的输入)。

我输入了一个txt文件,每行一个字符串,我必须对它进行排序。

这是我的顺序代码:

#start time
strt<-Sys.time()

#merge sort
mmerge<-function(a,b) {
r<-numeric(length(a)+length(b))
ai<-1; bi<-1; j<-1;
for(j in 1:length(r)) {
  if((ai<=length(a) && a[ai]<b[bi]) || bi>length(b)) {
    r[j] <- a[ai]
    ai <- ai+1
  } else {
    r[j] <- b[bi]
    bi <- bi+1          
  }
}
r
}

mmergesort<-function(A) {
  if(length(A)>1) {
  q <- ceiling(length(A)/2)
  a <- mmergesort(A[1:q])
  b <- mmergesort(A[(q+1):length(A)])
  mmerge(a,b)
} else {
  return(A)
}
}

#!/usr/bin/env Rscript
args = commandArgs(trailingOnly=TRUE)

# args test
if (length(args)==0 | length(args)==1) {
stop("Arquivo de entrada e saida devem ser fornecidos (input.txt, output.txt)", call.=FALSE)
 } 

#read file
input <- read.table(file=args[1], header=F)

#vector parser
input <- as.character(input[,1])

#sort
ordenado <- mmergesort(input)

#write file
write(ordenado, file=args[2], sep = "\t")

#end time
print(Sys.time()-strt)

1 个答案:

答案 0 :(得分:0)

我在关注this视频后使用了它(如果你只想要代码部分转到13:00-14:00):

library(foreach)
library(doParallel)

[...]

#merge sort
mmerge<-function(a,b) {
  r<-numeric(length(a)+length(b))
  ai<-1; bi<-1; j<-1;
  foreach(j= 1:length(r)) %do% {
    if((ai<=length(a) && a[ai]<b[bi]) || bi>length(b)) {
      r[j] <- a[ai]
      ai <- ai+1
    } else {
  r[j] <- b[bi]
  bi <- bi+1          
  }
}
  r
}

[...]

#number of clusters
registerDoParallel(4)

#sort
ordenado <- mmergesort(input)

#stop parallel
stopImplicitCluster()

[...]