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