【发布时间】: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