R 降雪:并行应用于 table 列
R snowfall : parallel apply on table columns
我有一个 table 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)
的降雪量是多少?
在此先感谢您的帮助!
这是一个工作示例:
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()
但是,在展示了如何执行之后,这是一种快速操作,考虑到启动实例等的开销,并行化可能不会提供明显更快的结果。
相当于 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
计算量不是很大,这还算不错。
非常感谢您的帮助!
我终于结合了卢卡斯和史蒂夫的解决方案,得到了我问题的理想解决方案。
我认为我的代码不适用于 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()
我有一个 table 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)
的降雪量是多少?
在此先感谢您的帮助!
这是一个工作示例:
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()
但是,在展示了如何执行之后,这是一种快速操作,考虑到启动实例等的开销,并行化可能不会提供明显更快的结果。
相当于 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
计算量不是很大,这还算不错。
非常感谢您的帮助!
我终于结合了卢卡斯和史蒂夫的解决方案,得到了我问题的理想解决方案。
我认为我的代码不适用于 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()