【问题标题】:how can i get R to release and stop holding memory even after all objects have been removed and cleared?即使在所有对象都已被删除和清除后,我如何才能让 R 释放并停止持有内存?
【发布时间】: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


【解决方案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()
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-25
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 2016-11-27
        相关资源
        最近更新 更多