2016-02-10 96 views
0

我有很多行和列的表男,從文本文件獲得:[R降雪:平行申請表列

M <- read.table("text.csv",header=TRUE,sep="\t") 

要獲取列的行列我成功地使用:

M <- apply(M,2,rank) 

我想加快計算速度,但我沒有成功實現這個功能在降雪。

我想:

library(snowfall) 
sfStop() 
nb.cpus <- 8 
sfInit(parallel=TRUE, cpus=nb.cpus, type = "SOCK") 
M <- sfClusterApplyLB(M, rank) # does not work 
M <- sfClusterApply(M,2,rank) # does not work 
M <- sfClusterApplyLB(1:8, rank,M) # does not work 

什麼是在降雪M <- apply(M,2,rank)等價?

在此先感謝您的幫助!

+0

的第二個參數「sfClusterApply」必須是一個函數。它不需要「保證金」的論點。 –

回答

1

降雪量相當於applysfApply。如採用四芯我的Linux機器上的順序版本

library(snowfall) 
sfInit(parallel=TRUE, cpus=4, type="SOCK") 
M <- data.frame(matrix(rnorm(40000000), 2000000, 20)) 
r <- sfApply(M, 2, rank) 
sfStop() 

本示例運行幾乎快一倍:下面是一個例子。考慮到rank不是非常計算密集的,這並不算太壞。

0

這裏是一個工作示例:

rank_M_df_col_fx=function(i){ 
    #M<- read.table("text.csv",header=TRUE,sep="\t") 
    col_rank=rank(M[,i]) 
    return(col_rank) 
} 

M=data.frame(replicate(10,sample(0:100,1000,rep=TRUE))) 
n_cols=ncol(M) 

library(snowfall) 
sfInit(parallel=TRUE) # 
sfExportAll() 
rank_results_list=sfLapply(x=c(1:n_cols), fun=rank_M_df_col_fx) 
rank_dataframe <- data.frame(matrix(unlist(rank_results_list), nrow=nrow(M), byrow=F)) 

sfRemoveAll() 
sfStop() 

然而,已經展示瞭如何做到這一點,這是一種快速的操作,並行化可能不會給出快得多的結果,因爲在開始實例的開銷等。

+0

非常感謝您給出了非常好的答案!我做了一些測試,正如你所指出的那樣,至少在我的例子中並行代碼並不快。 – Fred

+0

沒問題!如果我的回答回答你的問題,你應該檢查它作爲正確的答案... –

0

非常感謝您的幫助!

我終於結合了盧卡斯和史蒂夫的解決方案,爲我的問題獲得了理想的解決方案。

我認爲我的代碼不適用於M < - sfClusterApply(M,2,rank),因爲缺少sfExportAll()。

所以最後爲我工作的最簡單的解決方法是:

M <- read.table("text.csv",header=TRUE,sep="\t") 
n_cols=ncol(M) 
nb.cpus <- 4 
library(snowfall) 
sfStop() 
sfInit(parallel=TRUE, cpus=nb.cpus, type = "SOCK") 
sfExportAll() 
M <- sfApply(M,2,rank) 
sfRemoveAll() 
sfStop() 
+0

「等級」功能不需要任何來自全球環境的數據正確工作,而盧卡斯的答案中的「rank_M_df_col_fx」功能。在答案中使用「sfExportAll」只會浪費時間在不會使用的工作人員上創建全局變量。 「sfClusterApply」不適用於您的原因是因爲它相當於「lapply」,而不是「apply」。 –

+0

謝謝你的評論盧卡斯。確實,在「sfExportAll」排名的簡單例子中沒有用處。在另一個更復雜的計算中,我需要「sfExportAll」。 – Fred