R:在没有预分配的情况下动态更新矩阵时的效率问题

时间:2015-10-21 11:31:46

标签: r performance bigdata

我从API中提取数据,我通过for循环堆叠在一个数组中。我在for上使用plyr循环,因为我的代码不够健壮,但运行没有错误,因此现在我可以手动或使用{{1}重启for循环}。工作示例(为了说明,没有API调用,但有一些简单的计算):

tryCatch()

经过一番研究,我怀疑瓶颈是x <- 1:10000 mydata <- NULL for(i in 1:length(x)){ y = x[i] x1 = y*2 x2 = y*3 x3 = y*4 mydata <- rbind(mydata, cbind(x1,x2,x3)) } 行。典型的解决方案是预先分配矩阵以合并最终数据的维度。但是,我无法为我的目的预先分配矩阵的原因是API的输出具有不同的维度。我不知道我的数据的维度是什么(一些API调用返回零行,而其他API返回100)。如何使每次迭代的数据堆叠更加(时间)有效,特别是当rbind()的大小以及目标矩阵的增加时?

1 个答案:

答案 0 :(得分:4)

这里是一些选项的比较

使用您当前的代码:

  <script>
  $(function() {
    $( ".infoboxcontainer" ).tooltip({
      tooltipClass: "myNewClass"
    });

  });
  </script>

使用列表更快一点

x <- 1:10000

system.time({  mydata <- NULL
                for(i in 1:length(x)){
                  y = x[i]
                  x1 = y*2
                  x2 = y*3
                  x3 = y*4
                  mydata <- rbind(mydata, cbind(x1,x2,x3))
                }
              })

   user  system elapsed 
   1.42    0.00    1.42 

如果您将每个迭代的输出分配给不同环境中的对象并在之后检索它们,您将获得更多时间。

system.time({  mydata_list <- NULL
               for(i in 1:length(x)){
                 y = x[i]
                 x1 = y*2
                 x2 = y*3
                 x3 = y*4
                 mydata_list <- c(mydata_list, list(cbind(x1,x2,x3)))
               }
               mydata_list <- do.call("rbind", mydata_list)
             })

user  system elapsed 
0.42    0.00    0.42