【问题标题】:Writing to a large matrix much slower than normal写入大矩阵比正常慢得多
【发布时间】:2014-02-16 06:53:04
【问题描述】:

假设我这样做:

m <- matrix(0, nrow = 20, ncol = 3)

system.time(m[1, 1:3] <- c(1,1,1))

这需要 0 秒。

现在我这样做:

m <- matrix(0, nrow = 10000000, ncol = 3)

system.time(m[1, 1:3] <- c(1,1,1))

这在我的系统上大约需要 0.47 秒。

我需要填写一个大约 850 万行的矩阵,因此每行 0.47 秒不是一个选项。有没有办法解决?除了创建许多较小的子矩阵并在以后进行 rbinding 之外?

谢谢!

【问题讨论】:

  • 需要以这种方式逐行填充矩阵吗? (PS:在我的系统上只需要大约 0.03 秒的系统时间)
  • 是的。对于每个日期/项目组合,我需要执行滚动回归。日期数 * 项目数约为 850 万。我已经优化了 Rcpp 中的回归,现在分配值似乎是瓶颈:(即使是 0.03 秒,也就是 71 小时。
  • 那么,您调用回归函数约 850 万次,每次它返回一个长度为 3 的向量?如果是这样,也许可以考虑像parSapply 这样的东西,它可以通过利用多个内核来节省一些时间,并且可以一次返回整个矩阵。
  • 我用microbenchmark 重新运行了你的第二个代码块,平均需要1.205e-6 秒。对于 850 万行,这将超过 10 秒。 Win 8.1 (i4770) 上的 64 位 R 3.0.2。如果您的代码/数据具有足够的可移植性,fire me an email 我很乐意为您运行它并将结果矩阵发送给您。
  • 你会考虑多久?超过一天,两天?电脑时间很便宜。 :)

标签: r matrix


【解决方案1】:

开始新的 R 会话后:

m <- matrix(0, nrow = 10000000, ncol = 3)

system.time(m[1, 1:3] <- c(1,1,1))
# User        System      elapsed 
# 0           0           0 

n <- m
system.time(m[1, 1:3] <- c(1,1,1))
# User        System      elapsed 
# 0.074       0.061       0.135

m 第一次就地修改。自 m 以来第二次复制由 n 引用。

This question 可能会感兴趣。但是,如果您进行滚动回归,您应该首先查看它是否在某个包中实现。如果要在 Rcpp 中执行此操作,则应在 Rcpp 中执行整个循环,而不是分配给 m 8.5M 次。

【讨论】:

    猜你喜欢
    • 2016-10-10
    • 2012-07-14
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多