清理rpy2占用的内存

8 投票
1 回答
2030 浏览
提问于 2025-04-16 13:01

我该如何清理通过 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 的 文档

这个对象会一直存在,并且在 foo 从 Python 中删除之前,它会被保护,不会被 R 的垃圾回收机制清理掉。

但是即使这样做:

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

1 个回答

7

在rpy的文档中,有一段提到,当你删除或覆盖大型对象时,可能需要频繁运行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)

撰写回答