Очистка памяти, используемой rpy2 - PullRequest
6 голосов
/ 05 марта 2011

Как я могу очистить объекты (и занимаемую ими память), созданные с помощью 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 документов :

Сам объект остается доступным и защищен от сборки мусора R до тех пор, пока foo не будет удален из Python

, нодаже делать:

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 Ответ

6 голосов
/ 05 марта 2011

В rpy docs есть абзац, указывающий на то, что вам может понадобиться часто запускать сборщик мусора Python при удалении или перезаписи больших объектов:

R объекты живут вR памяти, их размер неизвестен Python, и поэтому кажется, что Python не всегда собирает мусор достаточно часто, когда задействованы большие объекты.Иногда это приводит к кратковременному увеличению использования памяти, когда большие объекты перезаписываются в циклах, и, хотя кажется, что достижение системного предела памяти вызывает запуск сборки мусора, можно явно инициировать сборку.

Я былвозможность заставить rpy2 освободить эту большую матрицу, запустив gc.collect() сразу после создания матрицы, и снова сразу после ее удаления и запустив внутреннюю функцию R gc().Запуск его в цикле в спящем режиме - используйте top для наблюдения за увеличением / уменьшением использования памяти.

Запуск под Python 2.6 в Ubuntu 10.0.4 с python-rpy версии 2.0.8, связанной с версией R2.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)
...