2016-07-23 3 views
0

私は私のマージをしようとしているparallelの代わりに、私は並列ライブラリを使用しようとしましたが、動作しません(私は正確にそれを使用する方法を知らないその内部にマージ機能を入れるが、私の入力では機能しない)。R - どのように私のmergesortを並列化する

1行に1文字列の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) 
+0

'sort'のような組み込み関数を使うことができない理由はありますか? https://stat.ethz.ch/R-manual/R-devel/library/base/html/sort.html –

+0

私は、1行につき1語のファイルを読む必要があると仮定すると、 'ordered < - sort(words [、1])'を使用します。これははるかに簡単だろうか? –

+0

原因はO(nlogn)でなければならず、rの通常のソートはO(n)です。 –

答えて

0

私は(uは単にコードの一部をしたい場合は13に行く:00-14:00):thisビデオに従った後、それは使用して作られた

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() 

[...] 
関連する問題