rpy2

2011-03-04 18 views
6

द्वारा उपयोग की जाने वाली क्लियरिंग मेमोरी मैं आरपीआई के माध्यम से ऑब्जेक्ट्स (और वे जिस स्मृति पर कब्जा कर लेते हैं) को कैसे साफ़ कर सकता हूं?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 

दुर्भाग्यपूर्ण प्रभाव rpy2 docs से अपने आवेदन में, स्मृति उपयोग बढ़ जाती है जब तक वहाँ नहीं पर्याप्त है और फिर इसे दुर्घटनाओं ... आर के कचरा संग्रह से संरक्षित जब तक 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, विन XP, आर 2.12.0

+0

आप कैसे देखते हैं कि स्मृति मुक्त नहीं है? – eyquem

+0

@eyquem: बस कार्य प्रबंधक ग्राफ और आंकड़े का उपयोग कर :) – Benjamin

उत्तर

5

वहाँ एक paragraph in the rpy docs इशारा आप अजगर कचरा चलाने के लिए आवश्यकता हो सकती है कि है कलेक्टर अक्सर जब हटाने या बड़ी वस्तुओं को अधिलेखित:

आर वस्तुओं, आर स्मृति स्थान में रहते हैं उनके आकार अजगर के नाम एक अज्ञात और क्योंकि इस बात का यह अजगर हमेशा कचरा अक्सर पर्याप्त इकट्ठा करता है कि जब बड़ी वस्तुओं involv रहे हैं लगता है ईडी। कभी-कभी लूप में बड़े ऑब्जेक्ट्स ओवरराइट किए जाने पर यह क्षणिक वृद्धि में वृद्धि का कारण बनता है, और हालांकि सिस्टम की मेमोरी सीमा तक पहुंचने से कचरा संग्रह ट्रिगर होता है, कोई भी संग्रह को स्पष्ट रूप से ट्रिगर करना चाहता है।

मैं सिर्फ इसे हटाने और आर के आंतरिक gc() समारोह चलाने के बाद तुरंत मैट्रिक्स बनाने के बाद gc.collect() चलाकर कि बड़े मैट्रिक्स मुक्त करने के लिए rpy2 मजबूर करने के लिए सक्षम था, और फिर से। नींद के साथ लूप में इसे चलाना - मेमोरी उपयोग में वृद्धि/कमी देखने के लिए top का उपयोग करें।

उबंटू 10.0.4 पर पायथन 2.6 के तहत चल रहा है जिसमें पाइथन-रपी संस्करण 2.0.8 आर संस्करण 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) 
+0

इससे मदद मिलती है, धन्यवाद। यदि मैं इसे आईडीईएल में लाइन से चलाता हूं, हालांकि, मुझे काम करने के लिए एक से अधिक बार gc.collect() चलाने की आवश्यकता है। कोई विचार क्यों? – Benjamin

+0

मेरा मानना ​​है कि इसे इस तथ्य से करना है कि gc.collect() अन्य आवंटन (आंतरिक पूल में रिटर्न ब्लॉक) के लिए पायथन प्रक्रिया के भीतर उपयोग के लिए स्मृति मुक्त कर देगा, जरूरी नहीं कि इसे तुरंत ऑपरेटिंग सिस्टम पर वापस छोड़ दें। तो इकट्ठा करने के लिए कई कॉल इसे जल्द से जल्द करने के लिए prodding हो सकता है। – samplebias

+0

क्या यह ऐसा करना संभव है यदि मैं ऑब्जेक्ट में आर नाम नहीं देता, जैसा कि 'ए = आरआर (' मैट्रिक्स (एनए, 1000000, 50) ') में है? – highBandWidth

संबंधित मुद्दे