当计算相同时,为啥 R 会随着时间的推移而减慢?
Posted
技术标签:
【中文标题】当计算相同时,为啥 R 会随着时间的推移而减慢?【英文标题】:Why is R slowing down as time goes on, when the computations are the same?当计算相同时,为什么 R 会随着时间的推移而减慢? 【发布时间】:2014-07-17 00:54:48 【问题描述】:所以我想我不太了解 R 中的内存是如何工作的。我一直遇到问题,即同一段代码在本周晚些时候变慢(使用相同的 R 会话 - 有时即使我清除工作区)。我试图开发一个玩具问题,我认为它再现了我在处理大型物体时观察到的“减速效果”。请注意,下面的代码有点占用内存(不要盲目地运行此代码而不调整 n 和 N 以匹配您的设置可以处理的内容)。请注意,您可能需要大约 5-10 分钟才能开始看到这种减速模式(可能更长)。
N=4e7 #number of simulation runs
n=2e5 #number of simulation runs between calculating time elapsed
meanStorer=rep(0,N);
toc=rep(0,N/n);
x=rep(0,50);
for (i in 1:N)
if(i%%n == 1)tic=proc.time()[3]
x[]=runif(50);
meanStorer[i] = mean(x);
if(i%%n == 0)toc[i/n]=proc.time()[3]-tic; print(toc[i/n])
plot(toc)
meanStorer 肯定很大,但它是预先分配的,所以我不确定为什么循环会随着时间的推移而变慢。如果我清除我的工作区并再次运行此代码,它将与最后几次计算一样慢!我正在使用 Rstudio(以防万一)。另外这里是我的一些系统信息
操作系统:Windows 7 系统类型:64 位 内存:8GB R 版本:2.15.1($platform 产生“x86_64-pc-mingw32”)这是一个 toc 图,在对 x 使用预分配之前(即在循环中使用 x=runif(50)
)
这是对 x 使用预分配后的 toc 图(即在循环中使用 x[]=runif(50)
)
?rm 没有做我认为它正在做的事情吗?当我清理工作区时,引擎盖下发生了什么?
更新:使用最新版本的 R (3.1.0),即使将 N 增加到 N=3e8,问题也不再存在(注意 R 不允许向量比这大太多)
虽然修复只是将 R 更新到最新版本令人非常不满意,因为我似乎无法弄清楚为什么 2.15 版本会出现问题。很高兴知道是什么原因造成的,所以我将继续保留这个问题。
【问题讨论】:
您是否使用过任何分析工具来查看减速可能实际发生的位置? This SO thread 有一些 R3.0.0+ 的分析技巧 我对内存使用知之甚少,但我知道 R 有这个连续空间的概念。可能是经过多次迭代并且尽管进行了清理,R 发现为x
找到一个连续的内存空间越来越困难。我会考虑测试的一件事是还为x
和tic
预先分配空间。并且可能在每次迭代后明确删除 (rm
) x
和 tic
,尽管我对此不太乐观。
我在运行您的代码时没有观察到任何这样的减速。这里和那里都有奇怪的峰值(当然没有像你明显的运行时间逐步增加那样),但总的来说它在 1.93 (SD = 0.04) 左右相当稳定,直到处理完成。我正在使用 16GB RAM 的 Win 8.1 x64,从 RStudio 运行 R 3.1.0。
不,x
会在您每次执行 x <- runif(50)
时重新分配。预分配它将是 1) x <- rep(0, 50)
在循环外和 2) x[] <- runif(50)
在循环内。
gc()
之后是不是回到了“最底层”?
【参考方案1】:
正如您在更新的问题中所说,高级答案是因为您使用的是带有错误的旧版本 R,因为使用最新版本的 R (3.1.0),问题不再存在。
【讨论】:
这不是问题的答案,问题是明确的“为什么” 当我读到这个问题时,对我的隐含(诚然有点滑稽)的回答是:because you are using an old version of R with a bug
以上是关于当计算相同时,为啥 R 会随着时间的推移而减慢?的主要内容,如果未能解决你的问题,请参考以下文章