2011-03-04 23 views
6

¿Cómo puedo eliminar objetos (y la memoria que ocupan) creados a través de rpy?Borrado de la memoria utilizada por rpy2

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 

El efecto desafortunado es que en mi aplicación, uso de memoria aumenta hasta que no es suficiente y luego se bloquea ... Desde el rpy2 docs:

El objeto en sí mismo sigue estando disponible, y protegidos de la basura colección de R hasta foo se elimina de Python

pero incluso haciendo:

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

no libera la memoria utilizada ...

EDIT: rpy2 2.0, Win XP, R 2.12.0

+0

¿Cómo ves que la memoria no se libera? – eyquem

+0

@eyquem: simplemente usando el gráfico y las estadísticas del administrador de tareas :) – Benjamin

Respuesta

5

Hay una paragraph in the rpy docs dando a entender que es posible que tenga que ejecutar la basura Python colector con frecuencia al borrar o sobrescribir los objetos grandes:

objetos R viven en el espacio de memoria R, su tamaño sin el conocimiento de Python, y debido a que parece que Python no siempre recoger la basura con bastante frecuencia cuando se involv objetos grandes ed. Esto a veces conduce a un aumento transitorio del uso de memoria cuando los objetos grandes se sobrescriben en bucles, y aunque alcanzar el límite de memoria de un sistema parece desencadenar la recolección de elementos no utilizados, es posible que desee activar explícitamente la colección.

I fue capaz de forzar rpy2 para liberar esa matriz grande mediante la ejecución de gc.collect() inmediatamente después de crear la matriz, y de nuevo justo después de eliminarlo y funcionando función interna gc() de R. Ejecutarlo en un bucle con suspensión: use top para ver cómo aumenta o disminuye el uso de la memoria.

Corriendo bajo Python 2.6 en Ubuntu 10.0.4 con python-rpy versión 2.0.8 vinculada a R versión 2.10.1. Espero que esto te ayude a progresar:

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) 
+0

Eso ayuda, gracias. Sin embargo, si lo ejecuto línea por línea en IDLE, necesito ejecutar gc.collect() más de una vez para que funcione. ¿Alguna idea de por qué? – Benjamin

+0

Creo que tiene que ver con el hecho de que gc.collect() liberará memoria para su uso dentro del proceso de Python para otras asignaciones (devolver bloques al grupo interno), no necesariamente la liberará de nuevo al sistema operativo inmediatamente. Entonces, las múltiples llamadas a recolectar pueden ser un estímulo para hacerlo más rápido. – samplebias

+0

¿Es posible hacer esto si no le doy un nombre R al objeto, como en 'a = R.r ('matriz (NA, 1000000, 50)')'? – highBandWidth

Cuestiones relacionadas