2009-08-07 17 views
9

मैं काफी बड़ी संख्या में वस्तुओं को स्टोर करने के लिए std::deque का उपयोग कर रहा हूं। अगर मैं उन वस्तुओं का एक समूह हटा देता हूं, तो मुझे लगता है कि इसकी स्मृति उपयोग घटती नहीं है, इसी तरह std :: vector के लिए।std :: deque से स्मृति को कैसे रिलीज़ करें?

क्या इसे कम करने का कोई तरीका है? मुझे पता है कि एक वेक्टर में आपको 'स्वैप चाल' का उपयोग करना होगा, जो मुझे लगता है कि यहां भी काम करेगा, लेकिन मैं इसके बजाय इससे बचूंगा क्योंकि इसे कंटेनर में छोड़े गए सभी तत्वों की प्रतिलिपि बनाने की आवश्यकता होगी (और इस प्रकार आपके पास यह आवश्यक है कि आपके पास प्रत्येक वस्तु को दो बार स्टोर करने के लिए पर्याप्त स्मृति)। मैं डेक के कार्यान्वयन से घनिष्ठ परिचित नहीं हूं, लेकिन इसकी मेरी समझ यह है कि ऐसी कई चीजों के बिना ऐसी चीज हासिल करना संभव हो सकता है (जबकि एक वेक्टर के साथ यह स्पष्ट रूप से नहीं है)।

मैं वीसी ++ (डंकमवेयर) एसटीएल का उपयोग कर रहा हूं, अगर इससे कोई फर्क पड़ता है।

+2

क्या आपने यह स्थापित किया है कि जैसे ही पर्याप्त आइटम उन्हें खाली करने के लिए हटा दिए जाते हैं, आपका डेक कार्यान्वयन पहले से ही स्मृति के ब्लॉक को मुक्त नहीं कर रहा है? या यह है कि आप वास्तव में प्रत्येक छोर पर ब्लॉक को फिर से आवंटित करके पिछले कुछ बाइट्स को निचोड़ना चाहते हैं? –

+0

मुझे ऐसा लगता है कि, काफी मोटे और तैयार तरीके से: मैं 100,000 आइटम जोड़ता हूं -> मेमोरी उपयोग ~ 90 एमबी है। मैं एक और 100,000 जोड़ता हूं -> मेमोरी उपयोग ~ 170 एमबी है। मैं 100,000 आइटम हटा देता हूं -> स्मृति उपयोग अभी भी ~ 170 एमबी है। एक और 100,000 जोड़ें -> अभी भी 170. मुझे लगता है कि 100,000 आइटम पर्याप्त से अधिक हैं कि इसमें खाली ब्लॉक होंगे जो इसे जाने पर मुक्त हो जाएंगे। – Peter

+5

प्रक्रिया का मेमोरी उपयोग, या संग्रह के स्मृति उपयोग? सिर्फ इसलिए कि संग्रह स्मृति को मुक्त करता है इसका मतलब यह नहीं है कि यह ओएस पर वापस जाता है, इसलिए वस्तुओं को हटाने के बाद 80 एमबी चार सरणी आवंटित करने का प्रयास करें, और देखें कि क्या उपयोग 250 एमबी तक है या 170 पर रहता है। क्षमा करें यदि आप पहले से ही यह सब जानते हैं सामान और इसके लिए जिम्मेदार है - लाखों नहीं होगा। –

उत्तर

14

इसे सीधे std :: deque में करने का कोई तरीका नहीं है। हालांकि, एक अस्थायी (जो मूल रूप से std :: वेक्टर में होता है जब आप इसकी क्षमता को कम करते हैं) का उपयोग करके करना आसान होता है।

यहां good article on std::deque है, जो इसे std :: vector से तुलना करता है। बहुत नीचे एक वेक्टर को स्वैप करने और घटाने का एक साफ तरीका दिखाता है, जो डेक के साथ काम करता है।

+0

धन्यवाद। मुझे संदेह था कि ऐसा करने का कोई तरीका नहीं हो सकता है, लेकिन ऐसा लगता है कि यह संभव होना चाहिए ... मैंने सवाल में बताया कि मैं इस मामले में स्वैप चीज़ का उपयोग करने के लिए क्यों नाराज हूं, लेकिन शायद मैं परवाह किए बिना इसे देखना है। – Peter

+0

पीटर - "स्वैप" चीज़ के साथ सबसे अच्छा विकल्प हेप आवंटित तत्वों का उपयोग करना है। उस स्थिति में, आप केवल सभी तत्वों की एक प्रति और उनकी स्मृति की बजाय संदर्भों की एक प्रति बना रहे हैं। यह आमतौर पर बहुत मामूली है। –

+0

स्वैप चीज केवल वेक्टर के आंतरिक पॉइंटर्स को स्वैप करती है, तत्वों को स्वयं नहीं। – Karu

4

डेक का स्मृति आकार घट सकता है या नहीं हो सकता है। जब और कैसे ऐसा होता है कार्यान्वयन विशिष्ट है। दुर्भाग्यवश आपके पास इस पर अधिक मैन्युअल नियंत्रण नहीं है क्योंकि डेक की क्षमता() या आरक्षित() भी कम है।

मैं सुझाव देता हूं कि अगर आप वास्तव में मेमोरी रिलीज का पता लगाते हैं तो आपकी सुविधा पर प्रदर्शन नहीं किया जा रहा है।

Deque स्मृति प्रबंधन का एक अंतरंग ज्ञान शायद (यह आपका वर्तमान कार्यान्वयन, सही है?) Dikum वेबसाइट से प्राप्त किया जा सकता है

1

std :: Deque अपनी संभाजक को स्मृति वापस आ जाएगी। अक्सर यह आवंटक ओएस को स्मृति वापस नहीं करेगा। ऐसे मामलों में, ऐसा प्रतीत होता है जैसे स्मृति "जारी नहीं" है। जैसे ही मेमोरी आवंटित करने के लिए मेमोरी वापस आती है, अच्छी याददाश्त रिसाव डिटेक्टर संतुष्ट होंगे, और समझें कि सभी मेमोरी free() द्वारा जारी नहीं की गई हैं।

3

के रूप में यह करने के लिए जानकारी कहा:

में C++ 0x/C++ 11, Deque (और कई अन्य कंटेनरों) एक नया कार्य "shrink_to_fit" जो अतिरिक्त आइटम हट जाएंगे और मूल रूप से क्षमता संरेखित कहा जाता है() == आकार()

+0

क्षमता() अभी भी shrink_to_fit() के बाद आकार() से अधिक हो सकती है - यह एक गैर-बाध्यकारी अनुरोध है; 'शून्य shrink_to_fit() {}' वास्तव में एक पूरी तरह से कानूनी कार्यान्वयन है। लेकिन एक अच्छा कार्यान्वयन के साथ भी, क्षमता() आकार() से अधिक हो सकती है, उदाहरण के लिए यदि कंटेनर में बहुत कम तत्व हैं, तो यह अभी भी अधिक स्मृति आवंटित करने के लायक हो सकता है। (खाली कंटेनरों के बारे में सोचो।) – Lrdx

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