मैं 1.4 मिलियन लाइनों के साथ एक बड़ी टेक्स्ट फ़ाइल में पढ़ रहा हूं जो आकार में 24 एमबी (औसत 17 वर्ण एक पंक्ति) है।डेल्फी में स्ट्रिंग्स के लिए अतिरिक्त मेमोरी क्यों?
मैं डेल्फी 200 का उपयोग कर रहा हूं और फ़ाइल एएनएसआई है लेकिन पढ़ने पर यूनिकोड में परिवर्तित हो जाती है, इसलिए आप कह सकते हैं कि एक बार कनवर्ट किया गया टेक्स्ट 48 एमबी आकार में है।
(संपादित करें: मैं एक बहुत सरल उदाहरण ... पाया जाता है):
AllLines := TStringList.Create; AllLines.LoadFromFile(Filename);
मैं डेटा की तर्ज कि पाया
मैं एक साधारण StringList में इस पाठ लोड हो रहा हूँ लगता है कि उनके 48 एमबी की तुलना में अधिक स्मृति लेना प्रतीत होता है।
वास्तव में, वे 155 एमबी मेमोरी का उपयोग करते हैं।
मुझे 48 एमबी का उपयोग करके डेल्फी या कुछ मेमोरी प्रबंधन ओवरहेड के लिए 60 एमबी की अनुमति नहीं है। लेकिन 155 एमबी अत्यधिक लगता है।
यह स्ट्रिंगलिस्ट की गलती नहीं है। मैंने पहले लाइनों को रिकॉर्ड संरचना में लोड करने का प्रयास किया था, और मुझे एक ही परिणाम मिला (160 एमबी)।
मैं नहीं देखता या समझता हूं कि डेल्फी या फास्टएमएम मेमोरी मैनेजर स्ट्रिंग को स्टोर करने के लिए आवश्यक स्मृति की 3 गुणा का उपयोग करने के कारण क्या हो सकता है। ढेर आवंटन अक्षम नहीं हो सकता है, है ना?
मैंने इसे डीबग किया है और जहां तक मैं कर सकता हूं इसका शोध किया है। यह क्यों हो सकता है कि यह क्यों हो रहा है, या विचार जो मुझे अतिरिक्त उपयोग को कम करने में मदद कर सकते हैं, की सराहना की जाएगी।
नोट: मैं इस उदाहरण के रूप में इस "छोटी" फ़ाइल का उपयोग कर रहा हूं। मैं वास्तव में एक 320 एमबी फ़ाइल लोड करने की कोशिश कर रहा हूं, लेकिन डेल्फी 2 जीबी रैम से अधिक पूछ रहा है और इस अतिरिक्त स्ट्रिंग आवश्यकता के कारण स्मृति से बाहर निकल रहा है।
एडिनम: मार्को कैंटू बस a White Paper on Delphi and Unicode के साथ बाहर आया। डेल्फी 200 ने प्रति स्ट्रिंग ओवरहेड 8 बाइट से 12 बाइट्स तक बढ़ाया है (प्लस स्ट्रिंग के लिए वास्तविक पॉइंटर के लिए शायद 4 और अधिक)। 17x2 = 34 बाइट लाइन प्रति अतिरिक्त 16 बाइट लगभग 50% जोड़ता है। लेकिन मैं 200% से अधिक ओवरहेड देख रहा हूं। अतिरिक्त 150% क्या हो सकता है?
सफलता !! आपके सुझावों के लिए आप सभी को धन्यवाद। तुम सब मुझे सोचते हो। लेकिन मुझे उत्तर के लिए जन गोइवार्ट्स क्रेडिट देना होगा, क्योंकि उन्होंने पूछा:
... आप TStringList का उपयोग क्यों कर रहे हैं? फ़ाइल को वास्तव में स्मृति में अलग लाइनों के रूप में संग्रहीत किया जाना चाहिए?
इससे मुझे समाधान हुआ कि 24 एमबी फ़ाइल को 1.4 मिलियन लाइन स्ट्रिंगलिस्ट के रूप में लोड करने की बजाय, मैं अपनी लाइनों को प्राकृतिक समूहों में समूहित कर सकता हूं, जो मेरे कार्यक्रम के बारे में जानते हैं। तो इसके परिणामस्वरूप स्ट्रिंग सूची में 127,000 लाइनें लोड हुईं।
अब प्रत्येक पंक्ति 17 के बजाय 190 वर्णों का औसत है। स्ट्रिंगलिस्ट लाइन पर ओवरहेड समान है लेकिन अब बहुत कम लाइनें हैं।
जब मैं इसे 320 एमबी फ़ाइल पर लागू करता हूं, तो यह अब स्मृति से बाहर नहीं चला जाता है और अब 1 जीबी से कम रैम में लोड होता है। (और लोड करने में केवल 10 सेकंड लगते हैं, जो बहुत अच्छा है!)
समूहबद्ध रेखाओं को पार्स करने के लिए थोड़ा अतिरिक्त प्रसंस्करण होगा, लेकिन यह प्रत्येक समूह के वास्तविक समय प्रसंस्करण में ध्यान देने योग्य नहीं होना चाहिए।
(यदि आप सोच रहे थे, तो यह एक वंशावली कार्यक्रम है, और यह अंतिम चरण हो सकता है जो मुझे 30 सेकंड से कम समय में 32-बिट एड्रेस स्पेस में लगभग दस लाख लोगों को लोड करने की अनुमति देने के लिए आवश्यक हो सकता है इसलिए मुझे अभी भी डेटा में डिस्प्ले और संपादन की अनुमति देने के लिए आवश्यक डेटा में इंडेक्स जोड़ने के लिए 20 सेकंड बफर मिला है।)
आप जो स्मृति लेते हैं उसे मापते हैं? मुझे उम्मीद है कि कार्य प्रबंधक से मेम उपयोग कॉलम के साथ नहीं। यह माप नहीं रहा है कि आप क्या सोच सकते हैं। –
स्मृति माप के लिए, मैं GlobalMemoryStatusEx का उपयोग करता हूं। देखें: http://msdn.microsoft.com/en-us/library/aa366589(VS.85).aspx – lkessler
आपको यह जांचना चाहिए कि वास्तव में डेल्फी में कितनी मेमोरी का उपयोग किया जाता है। डेल्फी एमएम ओएस से प्राप्त होने वाले बड़े ब्लॉक को आवंटित करेगा, और जब संभव हो तो उन्हें केवल ओएस में छोड़ दें (विखंडन और जैसे इसे अस्वीकार कर सकते हैं), तो विंडोज क्या देखता है और डेल्फी क्या अलग हो सकता है। यदि आप Sourceforge से उपलब्ध पूर्ण फास्टएमएम लाइब्रेरी का उपयोग करते हैं तो इसमें एमएम आवंटन से पूछताछ करने की सुविधा है जो आपको क्या हो रहा है पर गहराई से देखता है। अन्यथा आप इसे जांचने के लिए एक मेमोरी प्रोफाइलर (यानी AQTime) का उपयोग कर सकते हैं और देख सकते हैं कि आवंटित स्मृति, कब और क्यों। –