【问题标题】:Clearing memory used by rpy2清除 rpy2 使用的内存
【发布时间】:2011-07-09 03:10:11
【问题描述】:

如何清除通过 rpy 创建的对象(以及它们占用的内存)?

import rpy2.robjects as r
a = r.r('a = matrix(NA, 2000000, 50)')
del a    #if I do this, there is no change in the amount of memory used
r.r('rm(list=(ls(all=TRUE)))') # Same here, the objects disappear, but the memory is still used

不幸的是,在我的应用程序中,内存使用量会增加,直到没有足够然后它崩溃......来自rpy2 docs

对象本身仍然可用, 并免受 R 的垃圾影响 收集直到 foo 被删除 蟒蛇

但即使这样做:

import rpy2.robjects as r
a = r.r('a = matrix(NA, 2000000, 50)')
r.r.rm('a')
del a
r.r.gc()

不释放已使用的内存...

编辑:rpy2 2.0、Win XP、R 2.12.0

【问题讨论】:

  • 你怎么看内存没有被释放?
  • @eyquem: 只使用任务管理器图表和统计数据:)

标签: python memory-management rpy2


【解决方案1】:

有一个paragraph in the rpy docs 提示你在删除或覆盖大对象时可能需要经常运行 Python 垃圾收集器:

R 对象存在于 R 内存空间中,Python 不知道它们的大小,因此,当涉及到大对象时,Python 似乎并不总是足够频繁地进行垃圾收集。当大对象在循环中被覆盖时,这有时会导致内存使用量暂时增加,尽管达到系统的内存限制似乎会触发垃圾回收,但可能希望显式触发垃圾回收。

我能够通过在创建矩阵后立即运行gc.collect() 来强制 rpy2 释放该大矩阵,然后在删除它并运行 R 的内部 gc() 函数后再次运行。在睡眠循环中运行它——使用top 观察内存使用量的增加/减少。

在 Ubuntu 10.0.4 上的 Python 2.6 下运行,python-rpy 版本 2.0.8 链接到 R 版本 2.10.1。希望这可以帮助您取得一些进展:

import gc
import time

import rpy2.robjects as R

for i in range(5):
    print 'pass %d' % i
    R.r('a = matrix(NA, 1000000, 50)')
    gc.collect()
    R.r('rm(a)')
    R.r('gc()')
    gc.collect()

    print 'sleeping..'
    time.sleep(5)

【讨论】:

  • 这有帮助,谢谢。但是,如果我在 IDLE 中逐行运行它,我需要多次运行 gc.collect() 才能使其工作。知道为什么吗?
  • 我认为这与 gc.collect() 将释放内存以在 Python 进程中用于其他分配(将块返回到内部池)的事实有关,不一定将其释放回来立即到操作系统。因此,多次调用 collect 可能会促使它尽快这样做。
  • 如果我不给对象一个R名称,是否可以这样做,如a = R.r('matrix(NA, 1000000, 50)')
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-02
  • 2012-10-14
  • 1970-01-01
相关资源
最近更新 更多