R 降雪:并行应用于表格列

Posted

技术标签:

【中文标题】R 降雪:并行应用于表格列【英文标题】:R snowfall : parallel apply on table columns 【发布时间】:2016-05-21 02:38:35 【问题描述】:

我有一个从文本文件获得的包含许多列和行的表 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 &lt;- apply(M,2,rank)的等价物是什么?

提前感谢您的帮助!

【问题讨论】:

“sfClusterApply”的第二个参数必须是一个函数。它不需要“保证金”参数。 【参考方案1】:

这是一个工作示例:

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

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

【讨论】:

非常感谢您提供这个非常好的答案!我做了一些测试,正如您所指出的,至少在我的示例中,并行代码并不快。 没问题!如果我的回答回答了你的问题,你应该检查它作为正确答案...【参考方案2】:

降雪中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 的计算量不是很大,这还不错。

【讨论】:

【参考方案3】:

非常感谢您的帮助!

我终于结合了 Lucas 和 Steve 的解决方案,得到了我的问题的理想解决方案。

我认为我的代码无法与 M

所以最后对我来说最简单的解决方案是:

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

【讨论】:

“rank”函数不需要来自全局环境的任何数据即可正常工作,而 Lucas 的答案中的“rank_M_df_col_fx”函数则需要。在您的答案中使用“sfExportAll”只会浪费时间在不会使用的工作人员上创建全局变量。 “sfClusterApply”对你不起作用的原因是它相当于“lapply”,而不是“apply”。 感谢卢卡斯的评论。确实,在排名“sfExportAll”的简单示例中是没有用的。在另一个更复杂的计算中,我需要“sfExportAll”。

以上是关于R 降雪:并行应用于表格列的主要内容,如果未能解决你的问题,请参考以下文章

在 AWS 中使用雪(和降雪)在 R 中进行并行处理

R降雪环境问题

R中的平行回归(可能有降雪)

如何在 R 的并行方法中使用无效的记录器进行记录?

与降雪库并行化的结果不可重现?

在 R 中使用降雪包做一些模拟