R,改善循环,令人尴尬地平行?

时间:2015-12-29 09:27:21

标签: r parallel-processing

我对R来说比较新,我编写的代码非常非常慢。我已经开始研究像矢量化和令人尴尬的并行的想法,但我需要帮助来应用它们。这是我正在编写的代码,以及我对我面临的问题的理解:

for (k in 1:3) {

        for (i in 1:2) {
                p[i]<- sum(output[i,1:3]>=intv[k,1])/200
                                        }

        cp[k,1]<-crossprod(port,p)

                  }

Sample data:
intv<-array(c(1,5,15),c(3,1))
output<-array(c(5,10,15,20,25,30),c(2,3))
port<-array(c(1,2,3),c(3,1))


output is 16,384 rows by 200 columns in real data set
intv is 16,384 rows in real data set

本质上,这是从intv中获取一个值(它有16,384个不同的值),然后遍历输出中的每一行以查找值大于此值的列数。然后使用下一个intv值,依此类推......直到很多很多小时都过去了。

现在我对这个问题的理解是:

我很欣赏我必须从第一行的intv中获取一个值。 但我不知道为什么我应该按顺序遍历输出中的每一行以查找大于此值的列数。

更新:我尝试了lapply并替换了for循环,但文件大小太大,即使在AWS上也是如此。我尝试了for循环,花了大约3.5个小时。我真的非常感谢任何加快这一点的想法。

谢谢!

改变矩阵有很大帮助:

> system.time({for (i in 1:nrow(facnahum)) {
+ probm[i,1]<- sum(outputm[i,1:200]>=intvm[k,1])/200
+ 
+ }
+ })
   user  system elapsed 
   0.55    0.00    0.54 
> 
> 
> system.time({for (i in 1:length(facnahu$MDR)) {
+ prob[i]<- sum(output[i,1:200]>=intv[k,1])/200
+ 
+ }
+ })
   user  system elapsed 
   1.62    0.00    1.62 

1 个答案:

答案 0 :(得分:2)

这里有一些快速而肮脏的第一步 - 即使用一堆随机数来抽象你如何开始矢量化你的问题。

set.seed(12) #for comparability set a seed 
Output <- matrix(sample(x=c(10:40),40, TRUE), ncol=5)
Intv <- matrix(1:16, ncol=1) 
l <- lapply(X=Intv, FUN=`<`, Output) #reverse your operator because X=Intv
lc <- t(sapply(l, colSums))

抱歉,我发现你的样本数据太晚了。

完成上述示例后,您的下一步就是将*apply函数替换为例如par*apply。来自snow包的UICollectionView函数通过并行化来增强过程。