即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?

Posted

技术标签:

【中文标题】即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?【英文标题】:how can i get R to release and stop holding memory even after all objects have been removed and cleared? 【发布时间】:2015-11-13 13:55:50 【问题描述】:

我正在尝试让一些代码在 RAM 小于 4GB 的计算机上运行。我正在使用 32 位版本的 R 来强制执行该内存上限。当我尝试运行占用内存的命令并且一切都中断时,我在脚本末尾附近碰壁了。但是占用内存的任务本身需要不到 4GB。我已将问题缩小到以下事实 - 尽管在当前会话中从内存中清除了所有对象 - R 控制台仍然拥有 1.9GB 的 RAM。下面的屏幕截图突出了我遇到问题的确切位置:注意内存中的对象为零,但任务管理器说这个 R 实例有 1.8578GB 的​​ RAM。

如果我从内存中清除所有对象,然后运行 ​​gc() 仍然不会清除所有内存(如您在我的屏幕截图中所见)。

是否有可能以某种方式清除此内存?

如果它有任何用处,您可以通过运行 this script 来重现它直到崩溃点

谢谢!

编辑:在我得到的脚本末尾

[1] "current designing ./2011/bst.rda"
Error: cannot allocate vector of size 434.7 Mb
In addition: There were 50 or more warnings (use warnings() to see the first 50)
> gc(verbose=T)
Garbage collection 27232 = 15350+4362+7520 (level 2) ... 
31.5 Mbytes of cons cells used (49%)
450.6 Mbytes of vectors used (21%)
           used  (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells  1175911  31.5    2421436   64.7   1770749   47.3
Vcells 59048650 450.6  278146328 2122.1 461815808 3523.4
> rm(list=ls(all=TRUE))
> gc(verbose=T)
Garbage collection 27233 = 15350+4362+7521 (level 2) ... 
11.1 Mbytes of cons cells used (21%)
7.1 Mbytes of vectors used (0%)
         used (Mb) gc trigger   (Mb)  max used   (Mb)
Ncells 414283 11.1    1937148   51.8   1770749   47.3
Vcells 920035  7.1  222517062 1697.7 461815808 3523.4
> 

【问题讨论】:

这个帖子可能会有所帮助:***.com/questions/14580233/… gc(verbose=T) 显示什么?这可能是 R 和 Windows 任务管理器交互方式的问题。 你(英勇地)假设有一个神奇的开关可以让一切都在 4gb 和 32bits 上工作。好吧,可悲的是,没有。这就是为什么几乎每个有选择权的人都转向 64 位操作系统和更多内存的原因。使用像 R 这样的 dynamic 语言,您只能做如此多的事情。 您似乎遇到了内存碎片问题。尝试分配您需要的最大可能向量,并根据需要重用/覆盖它,而不是按顺序分配/释放。 我知道这不是您期望或希望的极客答案。但作为一种实用的解决方案,可以让您保持滚动而不浪费更多时间。当我遇到这类问题时,我会保存工作区“.RData”[也许之前清理一下] - 关闭所有内容 - 然后重新启动 R - 加载我的“.RData”并继续我的工作流程。甚至直到这个过程成为工作流程的一部分(通过脚本)本身...... 【参考方案1】:

这不仅适用于 R,而且一般适用于 Windows。通常,如果您在 R 中删除了变量/对象。该过程确实将内存释放到操作系统,但由于 Windows 的工作。该内存并没有完全释放,它被保留以防进程再次请求内存,因此您会看到 R 仍然持有所有内存。

所以请不要担心,它会保留以供重复使用:)

【讨论】:

【参考方案2】:

退出R后内存释放了吗?

也许您在磁盘中读取了一些数据(存储在临时文件中)而不是加载到 R。所以gc() 不会捕获这些数据。

或者从一开始就做mem_change(your command here),看看是什么导致了内存的变化。

【讨论】:

【参考方案3】:

尝试使用命令

memory.limit()
# [1] 1934
memory.size()
# you can increase memory limit for that particular session in Windows machine
memory.limit(10000)  ## Size in Mbs
memory.limit
# [1] 10000   

由于您的是 32 位,因此您的最大限制为 4095 MB。要查看有关 memory.size() 和 memory.limit() 的更多信息,请在 R 控制台上使用以下命令并阅读相关内容。

?memory.limit()
?memory.size()

希望您能从中得到一点帮助。您至少可以为该特定会话增加内存限制。

【讨论】:

以上是关于即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?的主要内容,如果未能解决你的问题,请参考以下文章

数据覆盖率多少才能进行数据分析对吗

Tkinter:所有单选按钮都已被选中

git:如何使其“意识到”文件已被删除[重复]

即使存在日志,Kafka经纪人也会关闭

我正在使用 selectpicker 我想编辑来自数据库的数据,但所有选项都已被选中

怎么样才能完全删除卸载软件后留在手机里的文件夹