2016-06-23 33 views
0

到目前为止,我所读过的有关R中的并行处理的内容涉及查看一个数据帧的多行。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)" 
) 

所有三个命令正在运行,但程序不进展到一切完成。编号: Bryan的建议奏效。我用第二个列表替换了“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

尝试这样:

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 

我与主题建模不同的数据库,这样做相当频繁。这个想法是创建你想要应用你的函数的数据列表,然后让你的函数并行地应用到这些索引列表中。对于你的例子,你必须列出你的data.frames列表和你的样本集的另一个列表。

+0

可能是我收到的最直接有用的答案。谢谢。 – eugheugh

+0

出于某种原因,即使我导出全局环境,我的加载库也没有在并行处理中被识别,所以我必须在函数中再次加载它们,但它可以工作。 – eugheugh

+1

您可以在'foreach'调用中添加参数'.packages = foo',它会将您的库加载到每个核心上。 –

相关问题