2013-02-06 15 views
9

मान लीजिए कि मेरे पास एक मान है जो स्मृति में बड़ा है (शायद एक विशाल मैट्रिक्स)। प्रतिलिपि के बजाय उस मान को किसी भिन्न वातावरण में स्थानांतरित करने का कोई तरीका है तो हटाएं? प्रतिलिपि/क्लोन दृष्टिकोण अस्थायी रूप से मूल्य के आकार से स्मृति पदचिह्न को बढ़ाता है।किसी मान को किसी भिन्न वातावरण में ले जाएं

मैंने इस post की समीक्षा की लेकिन इसमें मेरी समस्या का समाधान नहीं है। उसी वातावरण को साझा करना (प्रतिलिपि से बचने के लिए) कोई विकल्प नहीं है। मुझे वास्तव में मूल्य को स्थानांतरित करने की आवश्यकता है।

+4

आप कैसे नकल (विशेष रूप से 'के लिए (एन ls (ई 1, all.names = TRUE)) (एन असाइन करते हैं, (, एन प्राप्त ई 1), E2)' में) स्मृति बढ़ जाती है का एक उदाहरण प्रदान कर सकते हैं पदचिह्न? मैंने बस कोशिश की और अधिकतम मेमोरी का इस्तेमाल किया - जैसा कि 'gc() '--did द्वारा सूचित किया गया है। –

+1

मुझे लगता है कि आप सही हैं। यह स्मृति पदचिह्न में वृद्धि नहीं करता है। शायद वादे के कारण? ऐसा लगता है कि आप नए पर्यावरण को आवंटित कर सकते हैं और वर्तमान पर्यावरण से हटा सकते हैं और जब तक आप मूल्यांकन नहीं करते हैं तो आप अच्छे हैं। – SFun28

+2

यदि आप पुराने वातावरण से इसे हटाए जाने से पहले नए वातावरण में कोई ऑब्जेक्ट बदलते हैं तो एक प्रतिलिपि बनाई जाएगी। –

उत्तर

4

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

अद्यतन:

मैं दोहराने नहीं कर सकते हैं आप प्रति दृष्टिकोण के बारे में क्या कहते हैं। नीचे दिया गया कोड दिखाता है कि उपयोग की गई अधिकतम मेमोरी (जैसा कि gc द्वारा रिपोर्ट किया गया है) में वृद्धि नहीं होती है। ऐसा इसलिए है क्योंकि मान "वादा" होते हैं, गहरे प्रतिलिपि नहीं। एक प्रतिलिपि बनाई जाएगी, हालांकि, यदि आप पुराने वातावरण से इसे हटाने से पहले नए वातावरण में कोई ऑब्जेक्ट बदलते हैं।

R> e1 <- new.env() 
R> e1$x <- numeric(5e7) 
R> e1$y <- numeric(5e7) 
R> gc() 
      used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 171022 9.2  350000 18.7 350000 18.7 
Vcells 100271746 765.1 110886821 846.0 100272535 765.1 
R> e2 <- new.env() 
R> for(n in ls(e1, all.names=TRUE)) 
+ assign(n, get(n, e1), e2) 
R> gc() 
      used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 171038 9.2  350000 18.7 350000 18.7 
Vcells 100271788 765.1 116511162 889.0 100272535 765.1 
R> identical(e1$x,e2$x) 
[1] TRUE 
R> identical(e1$y,e2$y) 
[1] TRUE 
+0

डर्न! इससे पहले कि मैं निर्दिष्ट कर सकता हूं कि डिस्क पर क्रमबद्धता एक विकल्प नहीं था। मुझे माता-पिता/बाल संबंधों को संरक्षित करने की आवश्यकता नहीं है, लेकिन डिस्क समाधान स्मृति और प्रदर्शन के बीच एक व्यापार है। मैं सोच रहा था कि एक मेमोरी समाधान है या नहीं – SFun28