如何避免嵌套循环并加快程序速度

时间:2017-11-01 02:27:54

标签: r foreach parallel-processing nested-loops

我编写了这个程序来评估10000节点数据集和动态覆盖(覆盖范围意味着从一个节点开始它可以访问多少个节点)。它运行速度很慢,但失败并显示错误Error in unserialize(socklist[[n]]) : error reading from connection。我相信内存不足。任何建议都要加快速度,减少内存使用量。我甚至没有在我的系统上运行它,它在具有32个核心访问权的集群上运行。我使用foreach循环和doparallel库并行运行它。

#code for coverage graph
cover<- function(sampl){
#define the coverage parameter
co_nodes<-10
done<- 0
result<-matrix(nrow=10000,ncol =10000)
  if(co_nodes>1)
  {
    co_nodes<-co_nodes-1
    #loop to get all the elements.
    coverage_matrix<- NULL
    le<-unique(sampl$V2)
    le
    tl<-length(le)
    tl

    for(p in 1:tl)
    {
      message("main loop iteration:", p)
      #pick first node
      x<-le[p]
      x
      cv_matrix<- sampl[sampl$V1==x,]
      cv_matrix
      # ca   gets the new neibhour nodes from the matrix
      ca<-unique(cv_matrix$V2)
      ca
      chl<-length(ca)
if(chl==0)
{
next
}else
{
      for(i in (1:co_nodes))
      {
        message("coverage loop iteration:", i)
          #print("neibhour node")
          #print(c)
          # t gets nieghbours 
          t<-sampl[sampl$V1 %in% ca,]
cv_matrix<-rbind(cv_matrix,t)
          #message("ca:", ca)
          ca<-unique(t$V2)
          # print("ca after binding")
          #print(ca)
        message("exiting coverage loop iteration:", i )
        chl<-length(ca)
        if(chl==0)
        {
          break
        }
      }

cv_matrix$V1<- x
      coverage_matrix<-rbind(coverage_matrix,cv_matrix)
}
      }


    }else
  {
    coverage_matrix<- sampl
  }

此处co_nodes是覆盖变量。主循环运行10000次有两个循环,内部循环取决于覆盖变量。有没有办法删除循环并加快速度。 处理完循环后,它将转换为10000 * 10000矩阵。输入格式如下

V1 V2
33853   33842
33853   33848
33853   33852
33853   34702
33842   33839
33842   33843
33842   33848
33842   33853
33842   34696
33848   33842
33848   33849
33848   33853
33852   33740
33852   33853
33852   34703
34702   33853
34702   34701
34702   34703
33839   33816
33839   33837

输出的形式为01矩阵10000 * 10000

   179 181 182 280 281 282 283 284 285 286 287 294 419 423
179 0   0   0   0   0   0   0   0   0   0   0   0   0   0
181 1   0   1   0   0   0   0   0   0   0   0   0   1   1
182 0   0   0   0   0   0   0   0   0   0   0   0   0   0
280 0   0   0   0   1   1   1   1   1   1   1   1   0   0
281 0   0   0   1   0   1   1   1   1   1   1   0   0   0
282 0   0   0   1   1   0   1   1   1   1   1   1   0   0
283 0   0   0   1   1   1   0   1   1   1   1   1   0   0
284 0   0   0   1   0   1   1   0   1   1   1   1   0   0
285 0   0   0   1   1   1   1   1   0   1   1   0   0   0
286 0   0   0   1   1   1   1   1   1   0   1   1   0   0
287 0   0   0   1   1   1   1   1   1   1   0   1   0   0
294 0   0   0   0   0   0   0   0   0   0   0   0   0   0
419 0   0   0   0   0   0   0   0   0   0   0   0   0   0
423 0   0   0   0   0   0   0   0   0   0   0   0   0   0

0 个答案:

没有答案