2008-10-14 16 views
32

के लिए कोई स्मृति सीमा है, हम वर्तमान में SQL डेटाबेस से निकाले गए डेटा को पकड़ने के लिए कैश-सिस्टम बनाने और इसे अन्य अनुप्रयोगों (वेबसाइट, webservice, आदि) में उपलब्ध कराने के बारे में सोच रहे हैं। । हम कल्पना करते हैं कि कैश विंडोज़ सेवा के रूप में चल रहा है और मूल रूप से एक स्मार्ट शब्दकोश है जिसमें कैश प्रविष्टियां हैं। मेरा सवाल है, क्या एप्लिकेशन के कामकाजी सेट की सीमा है (यह विंडोज सर्वर 2003 के तहत चल रहा है)? या भौतिक स्मृति की सीमा सीमा है?क्या एक .NET प्रक्रिया

+1

अपने कैश समाप्ति नीति पर विचार करने से पहले आप कोड की पहली पंक्ति में लिखें। बाद में सेंकना मुश्किल है। मुझे लगता है कि ऐसा करने के लिए आपके पास अच्छा कारण है उदा। ऑफ़लाइन पहुंच प्रदर्शन पर्याप्त कारण नहीं है, आप स्थानीय मशीन पर मेमोरी ओवरहेड के माध्यम से perf खराब कर सकते हैं। –

+0

असल में, प्रदर्शन एक कारण है। दूसरा यह है कि हम कैश को केंद्रीकृत करना चाहते हैं ताकि इसे विभिन्न और ऑफलाइन अनुप्रयोगों द्वारा एक्सेस किया जा सके। क्या आपके पास कैश सिस्टम बनाने में अनुभव हैं? क्या आप आगे पढ़ने की सिफारिश कर सकते हैं? – Mats

+0

एएसपी.NET कैश सिस्टम कुछ विचार प्राप्त करने के लिए एक अच्छा स्थान हो सकता है, या शायद कैशिंग अनुप्रयोग ब्लॉक: http://msdn.microsoft.com/en-us/library/cc309502.aspx –

उत्तर

39

32 बिट या 64 बिट? 32 बिट 2 जीबी (एक प्रक्रिया के लिए), 64 बिट 1TB (enterprise edition 2003 server) है।

However, the maximum size of a CLR Object is 2gb यहां तक ​​कि 64 बिट पर भी।

अद्यतन: ऊपर दी गई जानकारी 2008 में सही थी। अधिक जानकारी के लिए Ohad's answer देखें। विंडोज 2016 सर्वर में अधिकतम 24TB हो सकता है।

+0

पढ़ने के लिए धन्यवाद। ऐसा लगता है कि यह पोस्ट .NET 2.0 के रिलीज से पहले लिखा गया है। मुझे आश्चर्य है कि अगर बाद के संस्करणों में कोई बदलाव आया है। – Mats

+2

यह रनटाइम के संस्करण 2.0 के लिए प्रासंगिक है, लेकिन मैं ऐसा मत सोचो कि यह 3.5 में बदल गया है। 2 जीबी की एक वस्तु (जब तक कि यह बाइट सरणी नहीं है) वैसे भी काफी असामान्य है - आपके मामले में यह ऑब्जेक्ट्स एन आकार की एक सूची होगी ताकि आप ठीक रहे। –

+1

प्रतिबंध भी .NET 4 में समान हैं। –

0

किसी अन्य विंडोज प्रोग्राम के साथ, आप पता स्थान से सीमित हैं। यही है: 32-बिट पर, आपके पास 2 जीबी पता स्थान हो सकता है। X64 पर, आपके पास 8TB हो सकता है।

यदि आपके पास 8TB भौतिक स्मृति नहीं है, तो यह पृष्ठ पर शुरू हो जाएगा।

+1

और यदि आप ' टी 8 हार्ड ड्राइव स्पेस उपलब्ध नहीं है (मेरी इच्छा है) तो आप OutOfMemoryException के लिए शुरू करना शुरू कर देंगे। बहुत बुरा। यह कुछ समय पहले होगा जब हम में से कई लोगों के पास हमारी विकास मशीनों में एचडीडी का आकार होगा। :( –

4

32 बिट विंडोज पर आप/3GB ध्वज के साथ विंडोज बूटिंग और "के रूप में बड़े पते के बारे में पता"

+0

क्या आपके पास इस पर कुछ और पढ़ने का लिंक है? – Mats

+2

ऐसा नहीं है कि आपको XP में अधिक स्मृति मिलती है (यानी, उस 4 जीबी रैम में से अधिक) यह है कि आप 3 जीबी रैम http://msdn.microsoft.com/en-us/library/ms791558 तक एक प्रक्रिया चला सकते हैं। एएसपीएक्स –

+1

वर्चुअल पीसी या वर्चुअल सर्वर http://blogs.msdn.com/virtual_pc_guy/archive/2004/12/23/331100.aspx –

1

मथायस अपने अनुप्रयोग को चिह्नित करके थोड़ा अधिक स्मृति प्राप्त कर सकते हैं,

नहीं वास्तव में प्रत्यक्ष प्रश्न का उत्तर , लेकिन इस समस्या के करीब आने का एक और तरीका जो कुछ बड़े नुकसान के आसपास होगा, जो कैशिंग समाधानों के साथ एक प्रमुख सिरदर्द हो सकता है। (क्षमा करें मुझे इस मामले पर कोई अनुशंसित पढ़ने की आवश्यकता नहीं है।)

हमने इसे पिछले प्रोजेक्ट में कार्यान्वित किया, और इससे अन्य समस्याएं आईं।

ऑफ़लाइन पहुंच के लिए, क्या आप डेस्कटॉप पर एसक्यूएल एक्सप्रेस का उपयोग अपने डेटाबेस का दर्पण बनाने के लिए कर सकते हैं (या बस आपको कैश करने की आवश्यकता है)? फिर आपको बस इतना करना है कि आपका एप्लिकेशन किस डाटाबेस पर इंगित कर रहा है स्विच करें। आप इसे स्टोर डिफ का भी उपयोग कर सकते हैं और इन्हें सर्वर पर फिर से चला सकते हैं - हालांकि इसमें अन्य समस्याएं हैं। आप स्थानीय प्रतिलिपि पर अनुमतियों को केवल पढ़ने के लिए बदल सकते हैं यदि ऐसा ही होना चाहिए।

शब्दकोश जो आप एसक्यूएल इंडेक्स की तरह उल्लेखनीय ध्वनि बनाने की सोच रहे हैं। यदि आप इसे इस तरह से वास्तुकार कर सकते हैं तो मैं आपके लिए नौकरी करने के लिए एसक्यूएल पर भरोसा करता हूं। उस पहिया को फिर से क्यों दोहराएं? यदि आप करते हैं, तो आपको कैश की समाप्ति और स्मृति प्रबंधन के बारे में सावधानी से सोचना होगा - खासकर अगर यह एक विंडोज़ सेवा है।

गुड लक,

सैम

20

मैं हाल ही में एक 32 बिट प्रक्रिया पर .NET में मेमरी सीमा के आसपास व्यापक रूपरेखा कर रहे हैं। हम सभी इस विचार से बमबारी हो गए हैं कि हम एक .NET आवेदन में 2.4 जीबी (2^31) तक आवंटित कर सकते हैं लेकिन दुर्भाग्य से यह सच नहीं है :(। आवेदन प्रक्रिया में उपयोग करने के लिए बहुत अधिक जगह है और ऑपरेटिंग सिस्टम एक महान काम करता है नौकरी हमारे लिए इसका प्रबंधन करती है, हालांकि, .NET का अपना ओवरहेड लगता है जो सामान्य वास्तविक अनुप्रयोगों के लिए लगभग 600-800 एमबी का खाता है जो स्मृति सीमा को धक्का देता है। इसका मतलब है कि जैसे ही आप पूर्णांक की एक सरणी आवंटित करते हैं 1.4 जीबी, आपको आउटऑफमेमरी अपवाद() को देखने की उम्मीद करनी चाहिए।

स्पष्ट रूप से 64 बिट में, यह सीमा बाद में होती है (चलो 5 साल में चैट करें :)), लेकिन स्मृति में सबकुछ का सामान्य आकार भी बढ़ता है (मुझे लगता है कि यह ~ 1.7 से ~ 2 गुना है) बढ़ी हुई शब्द के कारण आकार।

मुझे यह सुनिश्चित करने के लिए क्या पता है कि ऑपरेटिंग सिस्टम से वर्चुअल मेमोरी विचार निश्चित रूप से आपको एक प्रक्रिया के भीतर लगभग अंतहीन आवंटन स्थान नहीं देता है। यह केवल इतना है कि पूर्ण 2.4 जीबी एक ही समय में चल रहे सभी (कई) अनुप्रयोगों को संबोधित करने योग्य है।

+0

क्या कोई इस बिंदु की पुष्टि कर सकता है? यह बहुत प्रासंगिक है ... –

+0

मैं पुष्टि नहीं कर सकता लेकिन वास्तव में सच होने पर मेरे परीक्षणों के मुताबिक। –

12

MSDN से निम्न तालिका आपकी क्वेरी का सबसे सटीक उत्तर है। ध्यान दें कि IMAGE_FILE_LARGE_ADDRESS_AWARE ध्वज सीधे प्रबंधित कंपाइलर से सेट नहीं किया जा सकता है, हालांकि सौभाग्य से इसे via the editbin utility पोस्ट पोस्ट सेट किया जा सकता है। 4 जीटी/3 जीबी ध्वज को संदर्भित करता है।

alt text

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