लघु प्रश्न
मेरे पास एक लूप है जो 180,000 बार चलता है। प्रत्येक पुनरावृत्ति के अंत में परिणामों को टेक्स्टबॉक्स में जोड़ना चाहिए, जिसे वास्तविक समय में अपडेट किया जाता है।
उपयोग MyTextBox.Text += someValueकरने से एप्लिकेशन को भारी मात्रा में मेमोरी खाने का कारण बनता है, और यह कुछ हजार रिकॉर्ड के बाद उपलब्ध मेमोरी से बाहर निकल जाता है।
क्या पाठ को TextBox.Text180,000 बार लागू करने का एक अधिक कुशल तरीका है ?
संपादित करें मुझे वास्तव में इस विशिष्ट मामले के परिणाम की परवाह नहीं है, हालांकि मैं जानना चाहता हूं कि यह स्मृति हॉग क्यों लगता है, और अगर पाठ को टेक्स्टबॉक्स में जोड़ने के लिए अधिक कुशल तरीका है।
दीर्घ (मूल) प्रश्न
मेरे पास एक छोटा ऐप है जो सीएसवी फ़ाइल में आईडी नंबरों की एक सूची पढ़ता है और प्रत्येक के लिए एक पीडीएफ रिपोर्ट बनाता है। प्रत्येक पीडीएफ फाइल जेनरेट होने के बाद, ResultsTextBox.Textसंसाधित होने वाली रिपोर्ट की आईडी संख्या के साथ जोड़ दिया जाता है और इसे सफलतापूर्वक संसाधित किया जाता है। प्रक्रिया एक पृष्ठभूमि थ्रेड पर चलती है, इसलिए ResultsTextBox अद्यतन वास्तविक समय हो जाता है क्योंकि आइटम संसाधित हो जाते हैं
मैं वर्तमान में 180,000 आईडी नंबरों के खिलाफ ऐप चला रहा हूं, हालांकि जिस मेमोरी को एप्लिकेशन ले रहा है वह समय के साथ तेजी से बढ़ रहा है। यह लगभग 90K से शुरू होता है, लेकिन लगभग 3000 रिकॉर्ड द्वारा यह लगभग 250MB तक ले जा रहा है और 4000 रिकॉर्ड के अनुसार यह एप्लिकेशन लगभग 500 MB मेमोरी ले रहा है।
यदि मैं परिणाम टेक्स्टबॉक्स में अपडेट की टिप्पणी करता हूं, तो स्मृति लगभग 90K पर स्थिर रहती है, इसलिए मैं मान सकता हूं कि लेखन ResultsText.Text += someValueवह है जो स्मृति को खाने के लिए पैदा कर रहा है।
मेरा सवाल यह है कि यह क्यों है? टेक्स्टबॉक्स में डेटा को जोड़ने का एक बेहतर तरीका क्या है। यह मेमोरी नहीं खाती है?
मेरा कोड इस तरह दिखता है:
try
{
report.SetParameterValue("Id", id);
report.ExportToDisk(ExportFormatType.PortableDocFormat,
string.Format(@"{0}\{1}.pdf", new object[] { outputLocation, id}));
// ResultsText.Text += string.Format("Exported {0}\r\n", id);
}
catch (Exception ex)
{
ErrorsText.Text += string.Format("Failed to export {0}: {1}\r\n",
new object[] { id, ex.Message });
}
यह भी ध्यान देने योग्य होना चाहिए कि ऐप एक बार की चीज है और इससे कोई फर्क नहीं पड़ता कि सभी रिपोर्ट तैयार करने में कुछ घंटे (या दिन :)) लग रहे हैं। मेरी मुख्य चिंता यह है कि यदि यह सिस्टम मेमोरी सीमा को हिट करता है, तो यह चलना बंद हो जाएगा।
परिणाम को अपडेट करने वाली लाइन को छोड़ने के साथ मैं ठीक हूं, टेक्स्टबॉक्स ने इस बात को चलाने के लिए टिप्पणी की, लेकिन मैं यह जानना चाहूंगा कि क्या TextBox.Textभविष्य की परियोजनाओं के लिए डेटा को जोड़ने के लिए अधिक स्मृति कुशल तरीका है ।
StringBuilderपाठ को जोड़ने के लिए एक का उपयोग करने की कोशिश कर सकते हैं , फिर पूरा होने पर,StringBuilderपाठ बॉक्स को मान असाइन करें ।