मैं मुख्य रूप से की व्यवहार्यता में रुचि रखता हूं इस तरह की एक सरणी।एक गतिशील आवंटित 2 डी सरणी पर realloc() का उपयोग कर रहा है एक अच्छा विचार?
मैं एक ऐसे प्रोजेक्ट पर काम कर रहा हूं जहां मैंने एकल मॉलोक() कॉल का इस्तेमाल प्रत्येक व्यक्ति को सामान्य रूप से बड़े 2 डी सरणी बनाने के लिए किया है। (एमआईबी का केवल कुछ ही मिनट, सबसे बड़ा है।) बात यह है कि एक सरणी के जीवन में, इसकी सामग्री नाटकीय रूप से आकार में आधा हो जाती है (आधा से अधिक)। जाहिर है, मैं कार्यक्रम के जीवन के लिए अकेले सरणी आकार छोड़ सकता था। (यह केवल x एमआईबी रैम के जीबीबी के साथ एक सिस्टम पर उपलब्ध है।) लेकिन, हम कार्यक्रम समाप्त होने से पहले आवंटित आवंटित स्थान के आधे से अधिक के बारे में बात कर रहे हैं, और, मैं कैसे हूं सरणी का उपयोग करके, सभी जीवित डेटा पंक्तियों के एक संगत सेट (ब्लॉक की शुरुआत में) में रखा जाता है। ऐसा लगता है कि अगर मुझे वास्तव में इसकी ज़रूरत नहीं है तो वह रैम पर पकड़ने के लिए एक अपशिष्ट की तरह लगता है।
जबकि मुझे पता है कि realloc() गतिशील रूप से बनाए गए सरणी को कम करने के लिए उपयोग किया जा सकता है, एक 2 डी सरणी अधिक जटिल है। मुझे लगता है कि मैं इसके मेमोरी लेआउट को समझता हूं (जैसा कि मैंने इसे कार्यान्वित करने वाले फ़ंक्शन को कार्यान्वित किया है), लेकिन यह भाषा की मेरी समझ और उसके कंपाइलरों के कामकाज की सीमा को दबा रहा है। जाहिर है, मुझे पंक्तियों के साथ काम करना होगा (और पंक्ति बिंदुओं से निपटना होगा), न केवल बाइट्स, बल्कि मुझे नहीं पता कि यह सब के परिणाम कितने अनुमानित होंगे।
और, हाँ, मुझे एक एकल malloc() के साथ सरणी बनाने की आवश्यकता है। प्रश्न में वस्तु में कई मिलियन पंक्तियां हैं। मैंने प्रत्येक पंक्ति को अलग-अलग malloc() में लूप का उपयोग करने का प्रयास किया, लेकिन कार्यक्रम हमेशा लगभग 100,000 malloc() s पर जम गया।
char ** alloc_2d_arr(int cnum, int rnum) {
/* ((bytes for row pointers + (bytes for data)) */
char **mtx = malloc(rnum * sizeof (char *) + rnum * cnum * sizeof (char));
/* Initialize each row pointer to the first cell of its row */
char *p = (char *) (mtx + rnum);
for (int i = 0; i < rnum; i++) {
mtx[i] = p + i * cnum;
}
return mtx;
}
'realloc' ऐसी बड़ी तालिकाओं के लिए एक अच्छा विचार नहीं है, "avl" और "लाल-काले" पेड़ों को देखें। –
"अगर मुझे वास्तव में इसकी आवश्यकता नहीं है तो यह रैम पर पकड़ने के लिए एक अपशिष्ट की तरह लगता है।" - पहला * प्रोफ़ाइल *।दूसरा, एक पुनर्विक्रय आपके सभी अभी भी आंतरिक डेटा को अलग-अलग पृष्ठों पर प्रतिलिपि बनाने का उच्च जोखिम चलाता है, गैर-मामूली व्यय जिसमें आप पूरी तरह से राम को बचाने की कोशिश करने के कारण होते हैं, आप दावा करते हैं कि वास्तव में कोई समस्या नहीं है। यहां एकमात्र जीत-परिदृश्य 'रीयलोक' है जो उसी क्षेत्र-सिर को आपके मेमोरी बेस के रूप में रखता है, और अन्य उपयोग के लिए पूंछ-पृष्ठ लौटाया जाता है; कुछ 'realloc' के बारे में कोई गारंटी नहीं है .... – WhozCraig
... तो क्या आपने इसके बजाय केवल 2 (या 3 या 4, जो भी) आवंटन करना है, याद रखें कि आप अंततः कौन से हैं, और 'मुक्त() '- एक बार उस घटना को पार करने के बाद आपको अब आवश्यकता नहीं है? अर्थात। आपके मैट्रिक्स का "रखा" आधा पहले आवंटन में है, दूसरा आधा दूसरे आवंटन में है, और अंततः आप दूसरे छमाही को मुक्त करते हैं। – WhozCraig