[英]Clearing memory used by rpy2
如何清除通過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 文檔 :
對象本身仍然可用,並且在從Python中刪除foo之前保護其免受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
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.