内存问题与memory.limit()

TH3*_*339 7 memory-management r

我在16GB内存的机器上运行一些模拟.首先,我遇到了一些错误:

Error: cannot allocate vector of size 6000.1 Mb (the number might be not accurate)
Run Code Online (Sandbox Code Playgroud)

然后我尝试使用以下命令为R分配更多内存:

memory.limit(1E10)
Run Code Online (Sandbox Code Playgroud)

选择这么大的数字的原因是因为memory.limit不能让我选择一个小于我的系统总内存的数字

In memory.size(size) : cannot decrease memory limit: ignored
Run Code Online (Sandbox Code Playgroud)

在这样做之后,我可以完成我的模拟,但R占用了大约15GB的内存,这阻止了我进行任何后期分析.

我曾经object.size()估计所有生成的变量使用的总内存,只占用了大约10GB.我无法想象R占据了剩余的记忆.所以我的问题是如何合理地将内存分配给R而不会爆炸我的机器?谢谢!

Sim*_*lon 2

R 被解释为所见即所得(所见并不总是所得到)。正如评论中提到的,由于复制所述对象,您需要更多的内存来存储对象。此外,嵌套循环除了效率低之外,可能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
Run Code Online (Sandbox Code Playgroud)