मैं MATLAB के लिए नया हूं, यह नौकरी के विवरण में नहीं था और मुझे उस व्यक्ति के लिए लेने के लिए मजबूर होना पड़ा जिसने मेरी कंपनी का उपयोग कोड को लिखा और बनाए रखा। जीवन कठिन है।क्या मैं तर्क के रूप में उन्हें पास करने के बजाय वैरिएबल वैश्विक घोषित करके MATLAB में स्मृति को संरक्षित करता हूं?
जिस लड़के से मैं ले रहा हूं, उसने मुझे बताया कि उन्होंने स्मृति को बचाने के लिए global
के रूप में सभी बड़े डेटा वैक्टर घोषित किए हैं। अधिक विशेष रूप से, ताकि जब कोई फ़ंक्शन किसी अन्य फ़ंक्शन को कॉल करता है, तो वह डेटा को कॉपी करते समय डेटा की एक प्रति नहीं बनाता है।
क्या यह सच है? मैं Strategies for Efficient Use of Memory पढ़ा है, और यह कहा गया है कि
जब बड़े डेटा सेट के साथ काम, ध्यान रखें कि MATLAB एक इनपुट चर की अस्थायी प्रतिलिपि बुलाया समारोह अपने मूल्य को संशोधित करता है, तो बना देता है। यह अस्थायी रूप से सरणी को संग्रहीत करने के लिए आवश्यक स्मृति को दोगुना करता है, जो पर्याप्त स्मृति उपलब्ध नहीं होने पर MATLAB को त्रुटि उत्पन्न करने का कारण बनता है।
जब आप किसी कार्य करने के लिए एक चर गुजरती हैं, आप वास्तव में डेटा कि चर का प्रतिनिधित्व करता है के लिए एक संदर्भ से गुजर रहे हैं:
यह Memory Allocation For Array #Function Arguments में बहुत समान कुछ कहते हैं। जब तक इनपुट डेटा को फ़ंक्शन द्वारा संशोधित नहीं किया जाता है, कॉलिंग फ़ंक्शन में चर और कॉल किए गए फ़ंक्शन में चर मेमोरी में उसी स्थान पर इंगित करता है। यदि बुलाया गया फ़ंक्शन इनपुट डेटा के मान को संशोधित करता है, तो MATLAB मूल सरणी की प्रतिलिपि स्मृति में एक नए स्थान में, अद्यतन जो संशोधित मान के साथ प्रतिलिपि बनाता है, और इस नई सरणी में कॉल किए गए फ़ंक्शन में इनपुट चर को इंगित करता है।
तो क्या यह सच है कि global
का उपयोग बेहतर हो सकता है? ऐसा लगता है कि कोड में से कोई भी इनपुट इनपुट संशोधित करता है, यह सुनिश्चित करने के बजाय global
के रूप में सभी बड़े डेटा को स्पष्ट रूप से घोषित करने के लिए थोड़ा सा मैला लगता है। क्या मै गलत हु? क्या यह वास्तव में राम उपयोग में सुधार करता है?
आप बेहतर देखने के लिए राम उपयोग की निगरानी क्यों नहीं करते? मुझे नहीं लगता कि आपका प्रश्न किसी अन्य प्रदर्शन वाले लोगों से अलग है। आपको अपना कोड प्रोफाइल करना होगा। ऐसा लगता है कि आप दो लूप लिख सकते हैं और परीक्षण कर सकते हैं कि ग्लोबल या फ़ंक्शन के इनपुट के रूप में कोई वैरिएबल बेहतर होता है जब आपका कोड इनपुट के डेटा को बदलता है (यदि यह बिल्कुल करता है, क्योंकि स्मृति केवल तब "दोगुनी हो जाती है")। जवाब देने के लिए खेद है, लेकिन प्रदर्शन के मामले में बहुत सारे मिलचास हैं। – inerte
आपका बिल्कुल सही है, लेकिन मैंने सवाल पूछा, क्योंकि मुझे चिंता थी कि यह कोडिंग शैली का मामला था, न केवल स्मृति। ओह ठीक है ... – scraimer
युगल चीजें जो मदद कर सकती हैं: "मेमोरी प्रोफाइल" मैटलैब प्रोफाइलर में आवंटन को ट्रैक करेगा। और यदि आप R2008a + का उपयोग कर रहे हैं, तो नई शैली "हैंडल" ऑब्जेक्ट संदर्भ द्वारा पास कर सकती हैं, जो स्मृति को संरक्षित रखेगी लेकिन ग्लोबल्स की तुलना में बेहतर दायरा नियंत्रण रखेगी।लॉरेन के ब्लॉग का उपयोग करने के लिए –