我正在使用16GB内存的机器上运行一些模拟。首先,我遇到了一些错误:
Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate)
然后我尝试使用以下命令为R分配更多内存:
memory.limit(1E10)
选择如此大的数字的原因是因为memory.limit
无法允许我选择小于我的系统总内存的数字
In memory.size(size) : cannot decrease memory limit: ignored
这样做之后,我可以完成我的模拟,但R大约需要15GB内存,这阻止了我进行任何后期分析。
我使用object.size()
来估算所有生成的变量的总内存,这只占用了大约10GB。我无法想象R占据了剩余的记忆。所以我的问题是如何合理地将内存分配给R而不会爆炸我的机器?
谢谢!
答案 0 :(得分:2)
R被解释为WYSINAWYG(你看到的并不总是你得到的)。正如评论中所提到的,由于复制了所述对象,因此需要更多内存来存储对象。此外,有可能除了效率低下之外,嵌套的for
循环也是一个坏主意,因为gc
不会在最里面的循环中运行。如果你有任何这些我建议你尝试使用矢量化方法删除它们,或者你在循环中手动调用gc
来强制垃圾收集,但要注意这会减慢一些事情
以下示例说明了简单对象所需的内存问题。此代码生成data.frame
个对象。观察前后的内存使用情况以及生成的对象大小。在调用gc
之前,有很多垃圾可以累积。我认为垃圾收集在Windows上比* nix系统有问题。我无法复制Mac OS X底部的示例,但我可以在Windows上重复。循环和更多解释可以在The R Inferno第13页...
# Current memory usage in Mb
memory.size()
# [1] 130.61
n = 1000
# Run loop overwriting current objects
my.df <- data.frame(a=character(0), b=numeric(0))
for(i in 1:n) {
this.N <- rpois(1, 10)
my.df <- rbind(my.df, data.frame(a=sample(letters,
this.N, replace=TRUE), b=runif(this.N)))
}
# Current memory usage afterwards (in Mb)
memory.size()
# [1] 136.34
# BUT... Size of my.df
print( object.size( my.df ) , units = "Mb" )
0.1 Mb