2009-08-11 5 views
10

मैं MATLAB के लिए नया हूं, यह नौकरी के विवरण में नहीं था और मुझे उस व्यक्ति के लिए लेने के लिए मजबूर होना पड़ा जिसने मेरी कंपनी का उपयोग कोड को लिखा और बनाए रखा। जीवन कठिन है।क्या मैं तर्क के रूप में उन्हें पास करने के बजाय वैरिएबल वैश्विक घोषित करके MATLAB में स्मृति को संरक्षित करता हूं?

जिस लड़के से मैं ले रहा हूं, उसने मुझे बताया कि उन्होंने स्मृति को बचाने के लिए global के रूप में सभी बड़े डेटा वैक्टर घोषित किए हैं। अधिक विशेष रूप से, ताकि जब कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है, तो वह डेटा को कॉपी करते समय डेटा की एक प्रति नहीं बनाता है।

क्या यह सच है? मैं Strategies for Efficient Use of Memory पढ़ा है, और यह कहा गया है कि

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

जब आप किसी कार्य करने के लिए एक चर गुजरती हैं, आप वास्तव में डेटा कि चर का प्रतिनिधित्व करता है के लिए एक संदर्भ से गुजर रहे हैं:

यह Memory Allocation For Array #Function Arguments में बहुत समान कुछ कहते हैं। जब तक इनपुट डेटा को फ़ंक्शन द्वारा संशोधित नहीं किया जाता है, कॉलिंग फ़ंक्शन में चर और कॉल किए गए फ़ंक्शन में चर मेमोरी में उसी स्थान पर इंगित करता है। यदि बुलाया गया फ़ंक्शन इनपुट डेटा के मान को संशोधित करता है, तो MATLAB मूल सरणी की प्रतिलिपि स्मृति में एक नए स्थान में, अद्यतन जो संशोधित मान के साथ प्रतिलिपि बनाता है, और इस नई सरणी में कॉल किए गए फ़ंक्शन में इनपुट चर को इंगित करता है।

तो क्या यह सच है कि global का उपयोग बेहतर हो सकता है? ऐसा लगता है कि कोड में से कोई भी इनपुट इनपुट संशोधित करता है, यह सुनिश्चित करने के बजाय global के रूप में सभी बड़े डेटा को स्पष्ट रूप से घोषित करने के लिए थोड़ा सा मैला लगता है। क्या मै गलत हु? क्या यह वास्तव में राम उपयोग में सुधार करता है?

+2

आप बेहतर देखने के लिए राम उपयोग की निगरानी क्यों नहीं करते? मुझे नहीं लगता कि आपका प्रश्न किसी अन्य प्रदर्शन वाले लोगों से अलग है। आपको अपना कोड प्रोफाइल करना होगा। ऐसा लगता है कि आप दो लूप लिख सकते हैं और परीक्षण कर सकते हैं कि ग्लोबल या फ़ंक्शन के इनपुट के रूप में कोई वैरिएबल बेहतर होता है जब आपका कोड इनपुट के डेटा को बदलता है (यदि यह बिल्कुल करता है, क्योंकि स्मृति केवल तब "दोगुनी हो जाती है")। जवाब देने के लिए खेद है, लेकिन प्रदर्शन के मामले में बहुत सारे मिलचास हैं। – inerte

+0

आपका बिल्कुल सही है, लेकिन मैंने सवाल पूछा, क्योंकि मुझे चिंता थी कि यह कोडिंग शैली का मामला था, न केवल स्मृति। ओह ठीक है ... – scraimer

+2

युगल चीजें जो मदद कर सकती हैं: "मेमोरी प्रोफाइल" मैटलैब प्रोफाइलर में आवंटन को ट्रैक करेगा। और यदि आप R2008a + का उपयोग कर रहे हैं, तो नई शैली "हैंडल" ऑब्जेक्ट संदर्भ द्वारा पास कर सकती हैं, जो स्मृति को संरक्षित रखेगी लेकिन ग्लोबल्स की तुलना में बेहतर दायरा नियंत्रण रखेगी।लॉरेन के ब्लॉग का उपयोग करने के लिए –

उत्तर

6

मेरे अनुभव में, बशर्ते कि कोई भी कोड बड़े डेटा को संशोधित न करे, स्मृति उपयोग समान है, भले ही आप ग्लोबल वैरिएबल या इनपुट तर्क का उपयोग करें, जैसे मैटलैब डॉक्स कहते हैं। मैथवर्क्स कर्मचारी द्वारा blog post में और जानकारी है।

मैटलैब में प्रदर्शन समस्याओं पर लोकगीत का एक बहुत कुछ है और यह सब सही नहीं है। Matlab के आंतरिक कुछ बदल गया है। ऐसा हो सकता है कि पिछले संस्करण में वैश्विक चर का उपयोग करना बेहतर होगा।

+1

+1 और शीतलता का उत्तर भी। वह यहाँ एक उपयोगकर्ता है! - http://stackoverflow.com/users/113700/loren – scraimer

2

समाधान मेरे लिए थोड़ा अजीब लगता है। जैसा कि आप पहले से ही पाए गए हैं, अगर स्मृति फ़ंक्शन डेटा सरणी को संशोधित नहीं करता है तो इसका उपयोग स्मृति उपयोग पर महत्वपूर्ण प्रभाव नहीं होना चाहिए। हालांकि, यदि बुलाया गया फ़ंक्शन डेटा सरणी को संशोधित करता है, तो कार्यात्मक अंतर होता है: एक मामले में (डेटा सरणी वैश्विक बनाते हुए), परिवर्तन के बाकी कोड पर प्रभाव पड़ता है, दूसरे मामले में (संदर्भ के रूप में इसे पास करना) संशोधन केवल स्थानीय और अस्थायी हैं।

3

मैं तुम्हें काफी अपने खुद के सवाल का जवाब लगता है, लेकिन कुछ और संदर्भ यहाँ अच्छा होगा:

मैं इस पर एक वीडियो बनाया:

http://blogs.mathworks.com/videos/2008/09/16/new-location-and-memory-allocation/

क्या लोरेन की बात की थी के समान यहाँ:

http://blogs.mathworks.com/loren/2006/05/10/memory-management-for-functions-and-variables/

-Dogu

4

यह उत्तर कुछ हद तक स्पर्शपूर्ण हो सकता है, लेकिन यहां वर्णित एक अतिरिक्त विषय स्मृति का प्रबंधन करने के लिए nested functions का उपयोग है।

जैसा कि पहले से ही अन्य उत्तरों में स्थापित किया गया है, global चर के लिए कोई आवश्यकता नहीं है यदि आप फ़ंक्शन पर जा रहे डेटा को संशोधित नहीं करते हैं (क्योंकि यह संदर्भ द्वारा पारित किया जाएगा)। यदि संशोधित है (और इस प्रकार मूल्य से पारित किया गया है), global वैरिएबल का उपयोग करके आप स्मृति को सहेज लेंगे। हालांकि, global चर निम्नलिखित कारणों के लिए कुछ हद तक "गंवार" हो सकता है:

  • आप global varName की तरह एक घोषणा बनाने के लिए हर जगह आप उन्हें जरूरत है।
  • यह अवधारणात्मक रूप से एक छोटे से गन्दा हो सकता है कि यह कब और कैसे संशोधित किया जाता है, विशेष रूप से यदि वे कई एम-फाइलों में फैले हुए हैं, तो ट्रैक रखने की कोशिश कर रहे हैं।
  • उपयोगकर्ता आसानी से खराब कोड clear global के साथ अपना कोड तोड़ सकता है, जो सभी वैश्विक चरों को साफ़ करता है।

चर के विकल्प the first set of documentation you cited में निहित किए गए थे: नेस्टेड फ़ंक्शंस। इसके तत्काल बाद बोली आप उद्धृत एक कोड उदाहरण (जो मैं कुछ अलग ढंग से यहाँ स्वरूपित है) पीछा कर रहा है:

function myfun 

    A = magic(500); 
    setrowval(400, 0); 
    disp('The new value of A(399:401,1:10) is') 
    A(399:401,1:10) 

    function setrowval(row, value) 
    A(row,:) = value; 
    end 

end 

इस उदाहरण में, समारोह setrowvalनेस्टेड समारोह myfun के अंदर है। myfun के वर्कस्पेस में परिवर्तनीय Asetrowval के भीतर पहुंच योग्य है (जैसे कि इसे प्रत्येक में global घोषित किया गया था)। नेस्टेड फ़ंक्शन इस साझा चर को संशोधित करता है, इस प्रकार कोई अतिरिक्त मेमोरी आवंटन से परहेज करता है। आपको उपयोगकर्ता को अनजाने में कुछ भी साफ़ करने के बारे में चिंता करने की ज़रूरत नहीं है और (मेरी राय में) यह global चर घोषित करने से थोड़ा सा क्लीनर और आसान है।

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

  • कोई संबंधित समस्या नहीं^_^