【问题标题】:R memory issue with memory.limit()memory.limit() 的 R 内存问题
【发布时间】:2013-01-16 06:31:37
【问题描述】:

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

【问题讨论】:

  • 您确定您已经查看了所有现有变量吗? ls(all=TRUE) 是否只列出您生成的那些?请注意,即使删除了一个对象,在调用垃圾收集器之前,用于存储该对象的内存也不是空闲的。 R 会定期执行此操作,但您可以使用 gc() 强制收集。
  • 我没有检查所有内存的内存使用情况。但我确实在每次迭代后在我的模拟中使用了 gc()...
  • 一般来说,您需要大约 3 倍于对象占用的内存量。这是因为对象的复制。
  • @PaulHiemstra:这意味着我的 R 会话的内存使用情况正常吗?关于如何优化它的任何建议?谢谢

标签: r memory-management


【解决方案1】:

R 被解释为所见即所得(你看到的并不总是你得到的)。正如 cmets 中提到的,由于复制所述对象,您需要存储对象所需的更多内存。此外,除了效率低下之外,嵌套的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

【讨论】:

    猜你喜欢
    • 2021-05-22
    • 2023-03-15
    • 1970-01-01
    • 2017-11-01
    • 2021-12-24
    • 2023-02-20
    • 2011-03-21
    • 2014-02-27
    • 2020-03-05
    相关资源
    最近更新 更多