2010-05-09 17 views
5

जब मैं फॉलो में टाइप करता हूं। कोड, मैं 1073741823.मैं अपने वेक्टर में 1,000,000,000 क्यों आरक्षित नहीं कर सकता?

#include <iostream> 
#include <vector> 
using namespace std; 
int main() 
{ 
    vector <int> v; 
    cout<<v.max_size(); 
    return 0; 
} 

लेकिन जब मैं, 1,000,000,000 के लिए वेक्टर आकार बदलने के लिए v.resize(1000000000); द्वारा की कोशिश कार्यक्रम को क्रियान्वित करने बंद हो जाता है के रूप में उत्पादन मिलता है। प्रोग्राम को आवश्यक मेमोरी आवंटित करने में सक्षम कैसे किया जा सकता है, जब ऐसा लगता है कि यह सक्षम होना चाहिए?

मैं विंडोज 7 में मिनीजीडब्लू का उपयोग कर रहा हूं। मेरे पास 2 जीबी रैम है। क्या यह संभव नहीं होना चाहिए? यदि यह संभव नहीं है, तो क्या मैं इसे पूर्णांक की सरणी के रूप में घोषित नहीं कर सकता हूं और दूर हो सकता हूं? यह भी काम नहीं करता है।

एक और बात यह है कि, मान लीजिए कि मैं एक फ़ाइल का उपयोग करूंगा (जो आसानी से इतना डेटा संभाल सकता है)। मैं इसे कैसे पढ़ और लिख सकता हूं और एक ही समय में। fstream file("file.txt', ios::out | ios::in); का उपयोग पहली बार फ़ाइल नहीं बनाता है। लेकिन फ़ाइल का मानना ​​है कि, मैं पढ़ने और लिखने के लिए उपयोग करने में असमर्थ हूं। क्या मेरा मतलब यह है: फ़ाइल की सामग्री 111111 हो तो अगर मैं चलने दें: -

#include <fstream> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    fstream file("file.txt",ios:in|ios::out); 
    char x; 
    while(file>>x) 
    { 
    file<<'0'; 
    } 
return 0; 
} 

फ़ाइल की सामग्री अब 101010 हो नहीं करना चाहिए? एक चरित्र पढ़ें और फिर अगले के साथ 0 को ओवरराइट करें? या पूरी सामग्री को कुछ बफर में एक बार में पढ़ा गया था, फाइल में कम से कम 0 नहीं होना चाहिए? 1111110? लेकिन सामग्री unaltered रहती है। कृपया समझाएँ। धन्यवाद।

+4

स्टैक ओवरफ़्लो में आपका स्वागत है! ये दो अलग-अलग प्रश्न हैं। आम तौर पर आपको उन्हें अलग से पूछना चाहिए। –

+3

ये दो बहुत अलग प्रश्न हैं। क्या आप उन्हें दो प्रश्न पदों में विभाजित कर सकते हैं? – wilhelmtell

+0

धन्यवाद। मुझे खेद है, चूंकि स्मृति आवंटन काम नहीं कर रहा था, इसलिए मैंने एक ही काम करने की कोशिश की, लेकिन एक फाइल में, और वहां त्रुटियों का एक अलग सेट मिला। तो मैंने प्रश्नों को एक साथ रखा। मैं अगली बार अलग से पूछना सुनिश्चित कर दूंगा। – shreedhar

उत्तर

14
  1. एक 32-बिट प्रक्रिया केवल एक ही समय में 4 जीबी पता स्थान को संबोधित कर सकती है। आम तौर पर, इस 4 जीबी एड्रेस स्पेस का उपयोग अन्य सामानों को मैप करने के लिए किया जाता है। आपका वेक्टर बहुत अधिक विशिष्ट पता स्थान (4 बिलियन बाइट्स) लेने जा रहा है जो उपलब्ध होने की संभावना नहीं है।

  2. आपको memory map the file होना चाहिए। mmap देखें।

+0

यह चर्चा: http://stackoverflow.com/questions/2791330/which-is-better-in-general-map-or-vector-in-c/2791491#2791491 जर्मनी हो सकता है। – Clifford

+2

Win32 पर पता स्थान 2 जीबीबी तक सीमित है। मुझे लगता है कि लिनक्स 3 जीआईबी होना चाहिए। –

+1

@ विन्सेंट: विंडोज पर 3 जीबी स्विच भी है, हालांकि 2 जीबी डिफ़ॉल्ट है: http://technet.microsoft.com/en-us/library/bb124810%28EXCHG.65%29.aspx – sbk

0

लेकिन जब मैं, 1,000,000,000 के लिए वेक्टर आकार बदलने के लिए v.resize (1000000000) द्वारा की कोशिश; कार्यक्रम निष्पादन बंद कर देता है। मैं प्रोग्राम को आवश्यक स्मृति आवंटित करने के लिए सक्षम कैसे कर सकता हूं, जब ऐसा लगता है कि यह सक्षम होना चाहिए?

यह सी ++ एसटीएल कार्यान्वयन पर निर्भर कर सकता है, लेकिन आकार बदलने का कार्य अक्सर आप के लिए क्या पूछना तुलना में बहुत अधिक आरक्षण आवेदन का कारण बनता है।

0

एक पूर्णांक चार बाइट्स है, इसलिए 1,000,000,000 पूर्णांक 3.72 जीबी तक ले जाएंगे।

+2

नहीं, यह (कम से कम) ले जाएगा (कम से कम) बिल्कुल 4 ** जीबी ** या चौराहे 3.72 ** जीआईबी **। विवरण के लिए [बाइनरी उपसर्ग] (http://en.wikipedia.org/wiki/Binary_prefix) देखें। – fredoverflow

+9

@FredOverflow: कुछ हद तक pedantic! एकमात्र जगह मैंने कभी देखा है कि अक्सर उपयोग में शब्दावली विकिपीडिया पर है। उस संदर्भ में (जहां पाठक कंप्यूटर विशेषज्ञ नहीं हो सकता है), यह असंबद्धता का एक उपयोगी उद्देश्य प्रदान करता है, लेकिन यहां मुझे लगता है कि हम सभी जानते थे कि उनका क्या अर्थ पूरी तरह से अनजाने में था। – Clifford

0

आप संगत अनुक्रम में एक बिलियन पूर्णांक आवंटित करने के लिए कह रहे हैं। इस तरह के एक विशाल संगत स्थान खोजने की कठिनाई के अलावा आप बस उस जगह नहीं है। याद रखें कि एक सामान्य 32-बिट सिस्टम पर एक पूर्णांक 32 बिट्स, या 4 बाइट्स पर कब्जा करता है। एक अरब से गुणा करें और आप 2 जीबी से कहीं ज्यादा दूर जाते हैं। इसके अतिरिक्त, std::vector को आपके द्वारा पूछे जाने से अधिक आरक्षित करने की अनुमति है।

अपने दूसरे प्रश्न के लिए, यदि आप दोनों एक ही समय में उसी fstream ऑब्जेक्ट के साथ पढ़ते और लिखते हैं, तो सुनिश्चित करें कि seekg() और seekp() आपके पढ़ने और लिखने से पहले सुनिश्चित करें।

+0

समझ में आता है, यह इतना आवंटित करने में सक्षम नहीं होना चाहिए। लेकिन फिर क्यों 'वी।maxsize() 'मुझे उससे अधिक आवंटित करने की अनुमति देता है? – shreedhar

+0

और seekg और seekp के संबंध में, मैं इस धारणा के तहत था कि, पढ़ने और लिखने के लिए केवल एक फ़ाइल सूचक है? यदि दो हैं, तो क्या मैं फ़ाइल में लिख सकता हूं और फिर 'seekg (0)' का उपयोग किये बिना पूरी सामग्री पढ़ सकता हूं? – shreedhar

+0

'वेक्टर :: max_size() 'आपको इतना आवंटित करने की अनुमति नहीं देता है। यह केवल आपको बताता है कि आपके मानक पुस्तकालय कार्यान्वयन की सीमाएं क्या हैं। चाहे आपका हार्डवेयर इस सीमा तक पहुंच सके या नहीं, एक अलग कहानी है। – wilhelmtell

1

अधिकतम एसटीएल कार्यान्वयन का सामना करना एक बात है; ओएस से उपलब्ध स्मृति की अधिकतम मात्रा कुछ और है; आप उत्तरार्द्ध को मार रहे हैं।

उदाहरण के लिए आप कई char तत्वों का वेक्टर बनाने में सक्षम हो सकते हैं। किसी भी तरह से, ब्लिस्टरिंग प्रदर्शन की अपेक्षा न करें जब तक कि आप शारीरिक रूप से उस स्मृति को न लें (साथ ही जो भी ओएस और कुछ भी चल रहा हो); इस तरह के वेक्टर तक पहुंचने में कोई संदेह नहीं होगा क्योंकि डिस्क पेजों में सिस्टम पेज मेमोरी मेमोरी के रूप में बहुत अधिक डिस्क थ्रैशिंग होती है।

इसके अलावा 32 बिट एड्रेस स्पेस के साथ प्रोसेसर (या भौतिक पता स्थान पर ध्यान दिए बिना 32 बिट ओएस चलाने पर) केवल 4 जीबी (भौतिक या आभासी) को संबोधित कर सकता है, इसलिए एक वास्तुकला सीमा है। इसके अलावा कुछ ओएस उपयोगकर्ता की सीमा को सीमित करता है; उदाहरण के लिए Win32 में उपयोगकर्ता स्थान 2 जीबी पर तय किया गया है। Win64 के विभिन्न संस्करण कृत्रिम रूप से माइक्रोसॉफ्ट को अलग-अलग कीमतों का शुल्क लेने की अनुमति देने के लिए उपयोगकर्ता स्थान को सीमित करते हैं, इसलिए Win64 का उपयोग पर्याप्त पता स्थान की कोई गारंटी नहीं है।

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