2010-01-12 11 views
15

मैंने सोचा कि 64 बिट प्रक्रिया के लिए अधिकतम उपयोगकर्ता स्थान 8TB था, लेकिन मैंने थोड़ा परीक्षण किया और अधिकतम मुझे 10-11GB प्राप्त हो सकता था।नेट। X64 प्रक्रिया में मुझे 11GB से अधिक आवंटित स्मृति क्यों नहीं मिल सकती है?

नोट: मैं की जरूरत नहीं है कि अधिक स्मृति एक प्रक्रिया में, मैं सिर्फ क्यों जिज्ञासा से बाहर समझना चाहते हैं।

static void Main(string[] args) 
{ 
    List<byte[]> list = new List<byte[]>(); 

    while (true) 
    { 
     Console.WriteLine("Press any key to allocate 1 more GB"); 
     Console.ReadKey(true); 
     list.Add(new byte[1024 * 1024 * 1024]); 

     Console.WriteLine("Memory size:"); 
     double memoryUsage = Process.GetCurrentProcess().PeakVirtualMemorySize64/(double)(1024 * 1024 * 1024); 
     Console.WriteLine(memoryUsage.ToString("0.00") + " GB"); 
     Console.WriteLine(); 
    } 
} 

संपादित करें:

अपडेट किया गया परीक्षण कार्यक्रम अधिक नियतात्मक होने की

यहाँ अपने परीक्षण कार्यक्रम है।

एक जवाब मुझे पता है कि अगर 8TB केवल सैद्धांतिक है असली अधिकतम आबंटित स्मृति की गणना के तरीके चाहते हैं स्वीकार करने के लिए।

+0

आपके सिस्टम में कितनी मेमोरी है? शायद 12 जीबी? –

+0

विस्टा x64 पर 4 जीबी भौतिक मेमोरी अल्टीमेट –

+0

पेजिंग फ़ाइल कितनी बड़ी है? –

उत्तर

4

यह 8 टीबी, 8 टीबी तक नहीं है। आप संभावित रूप से 8 टीबी तक कर सकते हैं, लेकिन आपको मिलान करने वाली रैम/स्वैपफ़ाइल की आवश्यकता है।

+0

'आउटऑफमेमरी अपवाद' से पहले आपकी भौतिक रैम और एक स्वैप फ़ाइल भरने की संभावना है। –

+0

मुझे आश्चर्य है कि राम पूरी तरह से भरा हुआ होने पर क्या होता है। 'नया OutOfMemoryException' को कैसे फेंक दिया जाता है? – Earlz

+1

@earlz - उस अपवाद को फेंकने की स्मृति को पहले ही रनटाइम द्वारा आवंटित किया गया था। – codekaizen

1

कोशिश एक हिस्सा आवंटित (के रूप में 1 एमबी मात्रा की एक सूची के खिलाफ):

Dim p As IntPtr = System.Runtime.InteropServices.Marshal.AllocHGlobal(New System.IntPtr(24 * (1024^3))) 

संपादित - अपनी टिप्पणी को देखते हुए, कि आप केवल शारीरिक रैम 4 जीबी है, तो आप वास्तव में कोई काम का आवंटन किया है> ~ 8 जीबी और यहां तक ​​कि यह धक्का दे रहा है।

संपादित -

एक जवाब मुझे पता है कि अगर 8TB केवल सैद्धांतिक है असली अधिकतम आबंटित स्मृति की गणना के तरीके चाहते हैं स्वीकार करने के लिए। (- को छोड़कर राम में सब कुछ का आकार जो या पृष्ठांकित नहीं होगा नहीं किया जा सकता है कि पृष्ठ फ़ाइल का आकार) + (शारीरिक रैम आकार -

रैम आप आवंटित कर सकते हैं की अधिकतम राशि शायद के बराबर है आकार जो कुछ भी आपके सिस्टम को चालू रखने के लिए आवश्यक नहीं है या नहीं, ... यानी

बेशक पेज फ़ाइल बढ़ सकती है ...

डिस्क से/बाद में जल्द से जल्द या बाद में पेजिंग बहुत अधिक हो जाती है और आपका सिस्टम क्रॉल में धीमा हो जाता है और अनुपयोगी हो जाता है।

पढ़ें मार्क Russinovich के ब्लॉग:

+4

हाँ! 640 केबी किसी के लिए पर्याप्त होना चाहिए –

+0

@Terry - Way overused ... यहां तक ​​कि मजाकिया भी नहीं ... ~ गंभीरता से, यदि आप विंडोज मशीन पर दो बार भौतिक RAM की मात्रा आवंटित करने का प्रयास कर रहे हैं तो आप बेहतर ढंग से अपनी आवंटन रणनीति पर पुनर्विचार करेंगे। मेमोरी मैप की गई फाइलों आदि का उपयोग करें .. –

1

मेरा अनुमान है कि इसकी वजह से आप एक सूची है, जो मेरा मानना ​​है कि एक आंतरिक सीमा होती है का उपयोग कर रहे ।

public class ListItem<T> 
{ 
    public ListItem Parent; 
    public T Value; 

    public ListItem(ListItem<T> parent, T item) 
    { 
     this.Parent = parent; 
     this.Value = item; 
    } 
} 

मैं लिखा है लगभग कि इससे पहले कि सटीक कोड (केवल मेरे आइटम को पूर्णांक में था) एक मशीन पर इसे चलाने और:

आप क्या करता है, तो आप अपने खुद के पुराने स्कूल सूची बनाने की तरह कुछ कोशिश प्राप्त कर सकते हैं देखें 32 प्रोसेसर और 128 जीबी रैम के साथ, यह हमेशा एक ही आकार में बाहर निकलता है चाहे कोई फर्क नहीं पड़ता, और हमेशा Int32.MaxValue से संबंधित कुछ था, उम्मीद है कि मदद करता है।

+4

ए 'सूची ' में 'Int32.MaxValue/2' आइटम शामिल हो सकते हैं (क्योंकि यह आइटम्स को इंडेक्स करने के लिए Int32 का उपयोग करता है)। लेकिन ओपी 1 एमबी के हिस्सों में 10 जीबी तक पहुंचता है, इसलिए वह केवल 10000 हिस्सों को आवंटित करता है ... जो सीमा से बहुत दूर है। इसके अलावा, आपको लिंक की गई सूची को फिर से शुरू करने की आवश्यकता नहीं है, बीसीएल में पहले से ही 'लिंक्डलिस्ट ' कक्षा है ... –

+0

लिंक्डलिस्ट के संदर्भ के लिए धन्यवाद, मैं शायद ही कभी उनका उपयोग करता हूं, इसलिए मुझे नहीं पता था कि यह वहां था। –

8

यह आपकी मशीन है।

मेरे पास 8 जीबी रैम और 12 जीबी पेजफाइल वाला एक्स 64 है, और मैंने आपका प्रोग्राम चलाया और यह 16.23 जीबी पर शीर्ष पर रहा।

EPILOG: फिर मेरा विन 7 धीरे-धीरे कोमा में फिसल गया क्योंकि महत्वपूर्ण प्रक्रियाएं स्पष्ट रूप से स्मृति भूखा थीं।

संपादित: http://blogs.technet.com/markrussinovich/archive/2008/07/21/3092070.aspx और इस: आप को समझने के लिए विंडोज आवंटित (यानी भंडार और करता है) स्मृति चाहते हैं, यह पढ़ http://blogs.technet.com/markrussinovich/archive/2008/11/17/3155406.aspx

के बाद से नेट विंडोज पर निर्भर करता है स्मृति इसे बनाने के लिए उपयोग करता प्रबंधन करने के लिए जीसी ढेर, विंडोज़ इस तरह के मैकेनिक्स को दर्शाता है कि कैसे कम स्तर पर .NET में स्मृति आवंटित की जाती है।

+0

'महत्वपूर्ण प्रक्रियाएं जाहिर तौर पर स्मृति भूखा थीं। हा! मुझे लगता है कि * महत्वपूर्ण * प्रक्रियाएं * बिल्कुल * प्रक्रियाओं की तरह होंगी जो Win7 भूखा नहीं करना चाहेंगे :) – Seth

+0

ठीक है, जब स्मृति खत्म हो जाती है, तो यह चली गई है! – codekaizen

+0

+1 व्हाहाहा, इसने मुझे इतना कठिन हंस दिया –

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