我的代码如下所示(与原始版本相比略有简化,但仍反映了问题)。
require(VGAM)
Median.sum = vector(mode="numeric", length=75)
AA.sum = vector(mode="numeric", length=75)
BB.sum = vector(mode="numeric", length=75)
Median = array(0, dim=c(75 ,3))
AA = array(0, dim=c(75 ,3))
BB = array(0, dim=c(75 ,3))
y.sum = vector(mode="numeric", length=100000)
y = array(0, dim=c(100000,3))
b.size = vector(mode="numeric", length=3)
c.size = vector(mode="numeric", length=3)
for (h in 1:40)
{
for (j in 1:75)
{
for (i in 1:100000)
{
y.sum[i] = 0
for (f in 1:3)
{
b.size[f] = rbinom(1, 30, 0.9)
c.size[f] = 30 - rbinom(1, 30, 0.9) + 1
y[i, f] = sum( rlnorm(b.size[f], 8.5, 1.9) ) +
sum( rgpd(c.size[f], 120000, 1870000, 0.158) )
y.sum[i] = y.sum[i] + y[i, f]
}
}
Median.sum[j] = median(y.sum)
AA.sum[j] = mean(y.sum)
BB.sum[j] = quantile(y.sum, probs=0.85)
for (f in 1:3)
{
Median[j,f] = median(y[,f])
AA[j,f] = mean(y[,f])
BB[j,f] = quantile(y[,f], probs=0.85)
}
}
#gc()
}
它在执行过程中中断(h=7,j=1,i=93065),并显示错误:
Error: cannot allocate vector of size 526.2 Mb
刚刚收到这条信息后,我阅读了这个、这个和这个,但仍然不够。问题是,无论是垃圾回收器(gc()),还是清除工作区中的所有对象都没有帮助。我的意思是我已经尝试在代码中同时使用垃圾回收器和操作,在循环内删除所有变量并重新声明它们(请注意# gc()所在的位置,但后者未包含在我发布的代码中)。
对于我来说,这似乎很奇怪,因为整个过程在每个循环步骤中使用相同的对象(=>应该在每个循环步骤中消耗相同的内存)。为什么内存消耗随时间增加呢?
更糟糕的是,如果我想在同一个R会话中工作,甚至执行:
rm(list=ls())
gc()
即使我想声明一些微小的东西,例如:
,我仍然会收到相同的错误消息。
abc = array(0, dim=c(10,3))
只有关闭R并开始新会话才能解决问题,为什么?也许有一些方法可以重新编写我的循环?
R版本:2.15.1(32位),操作系统:Windows XP(32位)
我在这里比较新,因此非常感谢每一个提示!提前致谢。
编辑:(来自Arun)。我发现即使只有一个简单的例子,也可以更容易地重现这种行为。启动一个新的R会话,将此代码复制并粘贴,观察系统监视器中的内存增长。
mm <- rep(0, 1e4) # initialise a vector
for (i in 1:1e3) {
for (j in 1:1e3) {
for (k in 1:1e4) {
mm[k] <- k # already pre-allocated
}
}
}
for (i in 1:1000)
(包括所有虚拟值)需要870MB... - Arun