मैं सी # में द्रव सिमुलेशन पर काम कर रहा हूं। प्रत्येक चक्र में मुझे अंतरिक्ष में अलग-अलग बिंदुओं पर द्रव की वेग की गणना करने की आवश्यकता होती है। उस गणना के हिस्से के रूप में, मुझे कुछ डबल [] सरणी रखने के लिए स्क्रैच स्पेस के लिए कुछ दस किलो किलोबाइट की आवश्यकता होती है (सरणी का सटीक आकार कुछ इनपुट डेटा पर निर्भर करता है)। सरणी केवल उन पद्धतियों की अवधि के लिए आवश्यक होती हैं जो उनका उपयोग करती हैं, और कुछ अलग-अलग विधियां हैं जिन्हें इस तरह स्क्रैच स्पेस की आवश्यकता होती है।किसी प्रबंधित वातावरण में स्क्रैच मेमोरी
मैं इसे देखना, वहाँ खरोंच सरणियों के निर्माण के लिए कुछ अलग समाधान कर रहे हैं:
उपयोग 'नए' हर बार विधि कहा जाता है ढेर से स्मृति हड़पने के लिए। यह वही है जो मैं पहले कर रहा था, हालांकि यह कचरा कलेक्टर पर बहुत अधिक दबाव डालता है, और कुछ एमएस स्पाइक्स एक या दो बार एक दूसरे से वास्तव में परेशान हैं।
विधियों को कॉल करते समय स्क्रैच सरणी पैरामीटर के रूप में पास किया गया है। समस्या यह है कि यह उपयोगकर्ता को उन्हें प्रबंधित करने के लिए मजबूर करता है, जिसमें उचित रूप से उनका आकार शामिल है, जो एक बड़ा दर्द है। और यह एपीआई को बदलने के बाद से कम या ज्यादा स्क्रैच मेमोरी का उपयोग करना मुश्किल बनाता है।
प्रोग्राम स्टैक से स्क्रैच मेमोरी आवंटित करने के लिए एक असुरक्षित संदर्भ में स्टैकलॉक का उपयोग करें। यह ठीक काम करेगा, सिवाय इसके कि मुझे अपने कोड में असुरक्षित ब्लॉक को असुरक्षित और असुरक्षित करने की आवश्यकता होगी, जिसे मैं टालना चाहता हूं।
प्रोग्राम शुरू होने पर निजी एरे को प्रीलाकेट करें। यह ठीक है सिवाय इसके कि मुझे जरूरी सरणी के आकार को जरूरी नहीं है जब तक कि मैं कुछ इनपुट डेटा देख सकूं। और यह वास्तव में गन्दा हो जाता है क्योंकि आप इन निजी चर के दायरे को केवल एक ही विधि तक सीमित नहीं कर सकते हैं, इसलिए वे लगातार नामस्थान को प्रदूषित कर रहे हैं। और यह खराब तरीके से स्केल करता है क्योंकि स्क्रैच मेमोरी की आवश्यकता वाले तरीकों की संख्या बढ़ जाती है, क्योंकि मैं बहुत सारी मेमोरी आवंटित कर रहा हूं जो केवल उस समय का एक अंश उपयोग करता है।
किसी प्रकार का केंद्रीय पूल बनाएं, और पूल से स्क्रैच मेमोरी सरणी आवंटित करें। इसके साथ मुख्य समस्या यह है कि मुझे केंद्रीय पूल से गतिशील आकार के सरणी आवंटित करने का एक आसान तरीका नहीं दिखता है। मैं एक प्रारंभिक ऑफ़सेट और लंबाई का उपयोग कर सकता हूं और सभी स्क्रैच मेमोरी अनिवार्य रूप से एक बड़ी सरणी साझा कर सकती हैं, लेकिन मेरे पास बहुत सारे मौजूदा कोड हैं जो डबल [] एस मानते हैं। और मुझे इस तरह के पूल थ्रेड को सुरक्षित रखने के लिए सावधान रहना होगा।
...
किसी को भी एक ऐसी ही समस्या के साथ किसी भी अनुभव है? अनुभव से पेशकश करने के लिए कोई सलाह/सबक?
using(double[] scratchArray = new double[buffer])
{
// Code here...
}
इस बयान का उपयोग कर के अंत में descructor फोन करके स्मृति स्पष्ट रूप से मुक्त कर देगा:
क्या आपका वास्तव में कुछ किलो किलोबाइट का मतलब था? क्योंकि यह इतनी छोटी राशि है, मैं इसके लिए मेमोरी प्रबंधन के बारे में चिंता नहीं करता ... –
यह बहुत कुछ नहीं लगता है, लेकिन अगर मैं 2000 चक्र/सेकंड चला रहा हूं, अचानक यह 60 एमबी/सेकंड की तरह है, और जीसी नोटिस शुरू होता है। –
@JayLemmon, मुझे लगता है कि आप प्रदर्शन विवरणों के लिए इन विवरणों की देखभाल कर रहे हैं, है ना? यदि आपकी परियोजना समाप्त नहीं हुई है, तो मेरा सुझाव है कि आप इसे समाप्त होने तक प्रदर्शन की परवाह नहीं करते हैं। [Premature Optimization] (http://c2.com/cgi/wiki?PrematureOptimization) के बारे में इस आलेख को देखें। यदि परियोजना समाप्त हो गई है, तो लेख सामान्य रूप से __optimization__ पर भी दिलचस्प अवलोकन देता है। मैंने एक हिस्सा उद्धृत किया: "एक आम गलतफहमी यह है कि अनुकूलित कोड आवश्यक रूप से अधिक जटिल है [...] बेहतर फैक्टर कोड अक्सर तेज़ी से चलता है और कम स्मृति का भी उपयोग करता है [...]"। – jay