previous question relating to heap usage restrictions से निम्नलिखित के बाद, मैं डेटा के बड़े सरणी से निपटने के लिए एक अच्छी मानक सी ++ कक्षा की तलाश में हूं, जो मेमोरी कुशल और गति कुशल दोनों है। मैं एक एकल मॉलोक/हीलअलोक का उपयोग करके सरणी आवंटित कर रहा था लेकिन विभिन्न कॉलों का उपयोग करके कई ट्रे के बाद, ढेर विखंडन की गड़बड़ी गिरती रहती है। तो मैं निष्कर्ष निकाला हूं, 64 बिट पर पोर्ट करने के अलावा, एक तंत्र का उपयोग करना है जो मुझे कई छोटी मेमोरी टुकड़ों को फैलाए जाने वाली बड़ी सरणी की अनुमति देता है। मैं प्रति तत्व एक आवंटित नहीं चाहता क्योंकि यह बहुत स्मृति अक्षम है, इसलिए योजना एक वर्ग लिखना है जो [] ऑपरेटर को ओवरराइड करता है और इंडेक्स के आधार पर उपयुक्त तत्व का चयन करता है। क्या ऐसा करने के लिए वहां पहले से ही एक सभ्य वर्ग है, या क्या मैं अपना खुद का रोलिंग बेहतर कर रहा हूं?तेजी से और मेमोरी कुशल तरीके से डेटा के बड़े सरणी से निपटने के लिए अच्छा सी ++ सरणी वर्ग?
मेरी समझ से, और कुछ googling, 32 बिट विंडोज़ प्रक्रिया सैद्धांतिक रूप से 2 जीबी तक का पता लगाने में सक्षम होना चाहिए। अब मानते हैं कि मेरे पास 2 जीबी इंस्टॉल है, और कई अन्य प्रक्रियाएं और सेवाएं 400 एमबी के बारे में सोच रही हैं, आपको लगता है कि मेरे प्रोग्राम को ढेर से कितनी उम्मीदवार मिल सकती है?
मैं वर्तमान में विजुअल सी ++ के विभिन्न स्वादों का उपयोग कर रहा हूं।
संपादित पोइटा पद के अनुसार, मैं एक std :: Deque की कोशिश की है, VS2008 पर निम्न परीक्षण का उपयोग कर;
#include <deque>
using namespace std;
struct V
{
double data[11];
};
struct T
{
long data[8];
};
void dequeTest()
{
deque<V> VQ;
deque<T> TQ;
V defV;
T defT;
VQ.resize(4000000,defV);
TQ.resize(8000000,defT);
}
उपरोक्त डेटा के लिए कुल स्मृति 608MB में बाहर आता है, मैं सीधे malloc या HeapAlloc उपयोग करने के लिए गए थे, और < 1 सेकंड लेता है। डेक आकार का मूल रूप से 950 एमबी लिया गया, और फिर धीरे-धीरे वापस गिरना शुरू कर दिया। 15 मिनट बाद, डेकटेस्ट() ने प्रक्रिया के लिए केवल 6 एमबी मेमोरी का उपयोग करके समाप्त किया, जो शायद रन-टाइम के साथ अधिक था। मैंने विभिन्न पुश विकल्पों का उपयोग करके डेक को पॉप्युलेट करने का भी प्रयास किया, लेकिन प्रदर्शन इतना खराब था, मुझे जल्दी ही तोड़ना पड़ा। मैं संभवतः एक बेहतर प्रतिक्रिया प्राप्त करने के लिए डिफॉल्ट से बेहतर आवंटन प्रदान कर सकता हूं, लेकिन इसके चेहरे पर डेक इस नौकरी के लिए कक्षा नहीं है। ध्यान दें कि यह डेक के एमएस वीएस -2008 कार्यान्वयन से भी संबंधित हो सकता है, क्योंकि इस वर्ग में बहुत कुछ लगता है जो प्रदर्शन की बात करते समय बहुत ही कार्यान्वयन पर निर्भर करता है।
अपना खुद का बड़ा सरणी वर्ग लिखने का समय, मुझे लगता है।
दूसरा संपादित करें: आवंटन छोटी मात्रा के तुरंत बाद का उपयोग कर 1.875GB झुकेंगे;
#define TenMB 1024*1024*10
void SmallerAllocs()
{
size_t Total = 0;
LPVOID p[200];
for (int i = 0; i < 200; i++)
{
p[i] = malloc(TenMB);
if (p[i])
Total += TenMB; else
break;
}
CString Msg;
Msg.Format("Allocated %0.3lfGB",Total/(1024.0*1024.0*1024.0));
AfxMessageBox(Msg,MB_OK);
}
अंतिम संपादित मैं में कार्ड धारणा की एक डेक के रूप में सरणी के लिए पोइटा पद और विभिन्न टिप्पणियों को स्वीकार करने के लिए इसे निम्नलिखित, इसलिए नहीं कि मैं सीधे Deque वर्ग का उपयोग किया जाएगा का फैसला किया है, लेकिन अधिक टिप्पणियों का पालन किया। प्रति ब्लॉक तत्वों की एक निश्चित संख्या के आधार पर ओ (1) यादृच्छिक तत्व पहुंच के साथ लागू करने के लिए यह सरल होना चाहिए, जो मुझे चाहिए। प्रतिक्रिया के लिए सभी को धन्यवाद!
मुझे आशा है कि उनमें से कोई भी "स्वाद" वीसी 6.0 –
नहीं है जबकि मेरे पास अभी भी वीसी 6.0 है, और इसे कुछ चीजों के लिए उपयोग करें, रिलीज चरण के पास कहीं भी कहीं भी नहीं। अधिकतर वीएस 2008, कुछ वीएस2003, और कुछ ईवीसी ++ 4.0 यही कारण है कि मैं वीसी 6.0 भी बनाए रखता हूं। –
एक 32-बिट विंडोज प्रोग्राम 2 जीबी से अधिक मेमोरी आवंटित कर सकता है, आप बस इसे एक ही समय में मैप नहीं कर सकते हैं। - http://blogs.msdn.com/oldnewthing/archive/2004/08/10/211890.aspx – Bill