7

我正在一台 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 分配内存?谢谢!

4

1 回答 1

2

R 被解释为所见即所得(所见即所得。正如评论中提到的,由于复制所述对象,您需要存储对象所需的更多内存。此外,除了效率低下之外,嵌套for循环也可能不是一个好主意,因为gc它不会在最里面的循环中运行。如果您有任何这些,我建议您尝试使用矢量化方法删除它们,或者您手动调用gc循环以强制进行垃圾收集,但请注意这会减慢速度

下面的例子可以说明简单对象所需的内存问题。此代码生成一个data.frame对象。观察之前、之后的内存使用情况以及生成的对象大小。gc在调用之前允许积累很多垃圾。我认为垃圾收集在 Windows 上比 *nix 系统有问题。我无法在 Mac OS X 上复制底部的示例,但我可以在 Windows 上重复。循环和更多解释可以在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
于 2013-03-26T11:57:20.207 回答