R将函数调用分配给两个不同的核心

时间:2016-06-23 22:48:02

标签: r parallel-processing

到目前为止,我所读到的关于R中并行处理的所有内容都涉及查看一个数据帧的多行。

但是,如果我有两个或三个大型数据帧,我想执行一个长函数怎么办?我可以将函数的每个实例分配给特定的核心,这样我就不必等待它按顺序工作了吗?我在窗户上。

让我们说这是功能:

AltAlleleRecounter <- function(names,data){
data$AC <- 0
numalleles <- numeric(length=nrow(data))
for(i in names){
    genotype <- str_extract(data[,i],"^[^/]/[^/]")
    GT <- dstrfw(genotype,c('character','character','character'),c(1L,1L,1L))
    data[GT$V1!='.',]$AC <- data[GT$V1!='.',]$AC+GT[GT$V1!='.',]$V1+GT[GT$V1!='.',]$V3
    numalleles[GT$V1!='.'] <- numalleles[GT$V1!='.'] + 2
}
data$AF <- data$AC/numalleles
return(data)
}

我想要做的基本上是这个(通用的伪代码):

wait_till_everything_is_finished(
core1="data1 <- AltAlleleRecounter(sampleset1,data1,1)",
core2="data2 <- AltAlleleRecounter(sampleset2,data2,2)",
core3="data3 <- AltAlleleRecounter(sampleset3,data3,3)"
)

其中所有三个命令都在运行但程序在完成所有操作后才会进行。

编辑: 布莱恩的建议奏效了。我用我的第二个列表替换了“otherList”。这是示例代码:

myframelist <- list(data1,data2)
mynameslist <- list(names1,names2)
myframelist <- foreach(i=1:2) %dopar% (AltAlleleRecounter(mynameslist[[i]],myframelist[[i]]))
myfilenamelist <- list("data1.tsv","data2.tsv")
foreach(i=1:2) %dopar% (write.table(myframelist[[i]], file=myfilenamelist[[i]], quote=FALSE, sep="\t", row.names=FALSE, col.names=TRUE))

数据变量是数据框,名称变量只是字符向量。您可能需要重新加载一些软件包。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情:

library(doParallel)
library(foreach)

cl<-makeCluster(6) ## you can set up as many cores as you need/want/have here. 
registerDoParallel(cl)
getDoParWorkers() # should be the number you registered. If not, something went wrong.

df1<-data.frame(matrix(1:9, ncol = 3))
df2<-data.frame(matrix(1:9, ncol = 3))
df3<-data.frame(matrix(1:9, ncol = 3))
mylist<-list(df1, df2, df3)

otherList<-list(1, 2, 3)

mylist<-foreach(i=1:3) %dopar% (mylist[[i]] * otherList[[i]])
mylist

[[1]]
X1 X2 X3
1  4  7
2  5  8
3  6  9

[[2]]
X1 X2 X3
2  8 14
4 10 16
6 12 18

[[3]]
X1 X2 X3
3 12 21
6 15 24
9 18 27

我经常使用主题建模不同的数据库。我们的想法是创建要将函数应用到的数据列表,然后让foreach将函数并行应用于这些索引列表。对于您的示例,您必须列出data.frames和另一个样本集列表。