【问题标题】:Memory problems in RR中的内存问题
【发布时间】:2023-03-15 06:50:02
【问题描述】:

这是一个经常发生的现象。我尝试操纵某种大数据,例如

a <- matrix( rnorm( 1e4 * 200 ), ncol= 1e4 )
gr <- factor( rep( 1:2, each= 100 ) )
l <- lm( a ~ gr )
covs <- estVar( l )
cors <- cov2cor( covs )

经常会报以下错误: 错误:无法分配大小为 509.5 Mb 的向量

很好。我删除了一些不再需要的变量并调用垃圾收集器:

rm( a, l )
gc( TRUE )

但是,错误仍然存​​在。现在我保存 R 并重新启动它。而且——奇迹发生了:内存现在可用。为什么?如果以前没有足够的内存供 R 分配,但现在有足够的,有什么变化?我可以强制 R 以某种方式清理而不将数据保存到磁盘并等待它再次加载它们吗?没看懂。

我的sessionInfo():

> sessionInfo()
R version 3.0.1 (2013-05-16)
Platform: i486-pc-linux-gnu (32-bit)

locale:
 [1] LC_CTYPE=en_US.utf8       LC_NUMERIC=C              LC_TIME=en_US.utf8        LC_COLLATE=en_US.utf8     LC_MONETARY=en_US.utf8   
 [6] LC_MESSAGES=en_US.utf8    LC_PAPER=C                LC_NAME=C                 LC_ADDRESS=C              LC_TELEPHONE=C           
[11] LC_MEASUREMENT=en_US.utf8 LC_IDENTIFICATION=C      

attached base packages:
[1] graphics  utils     datasets  grDevices stats     methods   base     

P.S.: 正如free 所报告的那样,系统似乎还有大量未使用的内存。 top 报告说我的 R 进程(在错误之前)在我的 8 个进程中使用了大约 2GB,而且还有很多剩余。

【问题讨论】:

  • 你看过这里关于 R 和内存管理的任何现有帖子吗?
  • @DirkEddelbuettel:是的。有几个提到使用 gc(),一些正在使用(现在已过时)命令行开关,还推荐使用 data.table()(但合并大数据不是这里的问题)。大多数人建议对手头的问题进行临时修改,以便使用更少的内存。我还没有找到具体问题的答案(为什么 gc() 不起作用,为什么我必须重新启动 R)。
  • gc() 清除您不需要的东西,但是如果您的环境中有很多对象使用内存,那么您可能无法获得足够大的连续内存块。运行会话以再次重现您的问题,然后使用 rm( list = ls() ) ; gc() 并再次运行代码并查看它是否有效。
  • 我发现连续几次调用gc() 也有帮助——只需将(for i in 1:n) 包裹起来即可。但本质上是:“获得更多 RAM”或“使用更小的对象”。
  • “大数据”和“32 位”一般不兼容。这些天 RAM 超级便宜....

标签: r memory-management garbage-collection


【解决方案1】:

安装和使用 64 位 R 以利用更多 RAM。来自?Memory-limits

Unix
地址空间限制因系统而异:32 位操作系统的限制不超过 4Gb:通常为 3Gb。在 64 位操作系统上运行 32 位可执行文件将具有类似的限制:64 位可执行文件将具有基本上无限的系统特定限制(例如,对于 x86_64 cpus 上的 Linux 为 128Tb)。

【讨论】:

  • 这很奇怪。地址空间取决于内核,内核使用 PAE 扩展并且能够寻址完整的内存。
  • 看来他使用的是 32 位机器,所以这是不可能的。注意Platform: i486-pc-linux-gnu (32-bit) 来自sessionInfo
  • @gwatson 那么为什么在 32 位操作系统上有 8GB 内存呢?我假设有双引导或者他正在使用某种虚拟机设置?
  • @January:AFAIK 你可以使用 PAE 访问所有内存,但单个最大的块仍然是 3 GB。您不能通过内核扩展使 32 位 int 变得更大。
  • @gwatson:不,我只是老了,仍然将 64b 系统视为新奇事物。这是我第一次看到离开 32b 的理由。
【解决方案2】:

不确定在 32 位机器上还能做什么。也许尝试使用流行的内存不足处理包之一,如bigmemory?这是一个链接,http://www.bigmemory.org/

【讨论】:

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