0

我有一个包含许多列和行的表 M,从文本文件中获得:

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)降雪量相当于什么?

在此先感谢您的帮助 !

4

3 回答 3

1

相当于apply降雪量的是sfApply。这是一个例子:

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

这个例子在我使用四核的 Linux 机器上的运行速度几乎是顺序版本的两倍。考虑到rank计算量不是很大,这还不错。

于 2016-02-14T01:43:56.650 回答
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()

然而,在展示了如何做到这一点之后,这是一种快速操作,考虑到启动实例的开销等,并行化可能不会产生明显更快的结果。

于 2016-02-11T00:14:41.440 回答
0

非常感谢您的帮助 !

我最终将 Lucas 和 Steve 的解决方案结合起来,为我的问题获得了理想的解决方案。

我认为我的代码不能与 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()
于 2016-02-15T10:26:55.877 回答