2011-10-19 14 views
6

मैंने पाया है कि कई स्रोतों ने सुझाव दिया है कि वीबीए कोड के लिए सरणी का आकार मशीन में स्मृति की मात्रा पर निर्भर करता है। हालांकि यह मेरे लिए मामला नहीं रहा है। मैं निम्नलिखित, बहुत ही सरल, कोड चल रहा हूँ परीक्षण करने के लिए:एक्सेल 2007 वीबीए ऐरे आकार सीमा

Sub test6() 
Dim arr(500, 500, 500) As Boolean 
End Sub 

हालांकि, अगर मैं बदल आकार 600x600x600 होने के लिए, मैं स्मृति त्रुटि के बाहर निकलना। जिस मशीन का मैं उपयोग कर रहा हूं वह 16 जीबी रैम है, इसलिए मुझे संदेह है कि भौतिक RAM मुद्दा है।

मैं एक्सेल 2007 का उपयोग कर रहा हूं। क्या वीबीए को और रैम का उपयोग करने के लिए कोई चाल है?

उत्तर

3

यह यदि कोई Application.UseMoreMemory() समारोह है कि हम सिर्फ कह सकते हैं :-)

ओह, मैं कोई भी के बारे में पता था अच्छा होगा।

सभी डॉक्स मैंने देखा है का कहना है कि यह स्मृति द्वारा सीमित है, लेकिन यह भौतिक स्मृति मुद्दा है कि नहीं है, यह आभासी पता स्थान आप आप के लिए उपलब्ध हो।

आपको यह ध्यान रखना चाहिए कि 500 ​​से 600 की वृद्धि केवल मध्यम वृद्धि की तरह दिखती है (हालांकि 20% अपने आप पर काफी बड़ा है), क्योंकि आप इसे तीन आयामों में कर रहे हैं, यह काम करता है भंडारण आवश्यकताओं को दोगुना करने के करीब हो।

स्मृति से, Excel 2007 बूलियन प्रकार के लिए कम पूर्णांकों (16 बिट) का इस्तेमाल किया तो, कम से कम, अपने 500 सरणी 250M के बारे में (500x500x500x2) तक का समय लग जाएगा।

600 के सभी आयामों को बढ़ाने से आपको 600x600x600x2, या 432M मिल जाएगा।

सभी अच्छी तरह से 2 जी प्रयोग करने योग्य पता स्थान है कि आप शायद एक 32-बिट मशीन में है के भीतर (मुझे लगता है कि Excel 2007 एक 64-बिट संस्करण के लिए किया था पता नहीं है), लेकिन ये बातें छोटा नहीं कर रहे हैं, और आपको उस पते की जगह को अन्य चीजों के साथ साझा करना होगा।

यह देखना दिलचस्प होगा कि आप किस बिंदु पर त्रुटियों को प्राप्त कर रहे हैं

पहले चरण के रूप में, मैं इस तरह की एक बड़ी सरणी की आवश्यकता को देख रहा हूं। यह एक अलग तरीका हो सकता है, जैसे कि सरणी को विभाजित करना ताकि इसका केवल एक हिस्सा किसी भी समय स्मृति में हो (मैनुअल वर्चुअल मेमोरी की तरह)।

वास्तव में यादृच्छिक पहुंच के लिए यह अच्छा प्रदर्शन करने की संभावना नहीं है, लेकिन अधिक अनुक्रमिक पहुंच के लिए बहुत बुरा नहीं होना चाहिए और कम से कम आपको जाना होगा (एक धीमी समाधान गैर-काम करने वाले व्यक्ति के लिए बेहतर है)।

एक और संभावना बिट हैंडलिंग को दूर करने के लिए है ताकि आपके बूलियन वास्तव में शब्दों के बजाए बिट्स के रूप में संग्रहीत किए जाएं।

आपको getBool और setBool के लिए फ़ंक्शन प्रदान करना होगा, शब्दों की सरणी पर बिटमैस्क ऑपरेटरों का उपयोग करके और फिर, प्रदर्शन उस क्रैश-हॉट नहीं होगा, लेकिन आप कम से कम तब तक सक्षम होंगे के बराबर:

' Using bits instead of words gives 16 times as much. ' 
Dim arr(8000, 8000, 8000) As Boolean 

हमेशा की तरह, यह अपने उपयोग के रुझानों क्या आप के लिए सरणी की जरूरत पर निर्भर करता है, और।

+0

500 से 600 की वृद्धि सिर्फ एक मोटा काम था जो मैंने किया था। असल में हम कुछ ऐसा करने के लिए एक्सेल का उपयोग करने की कोशिश कर रहे हैं जिसे वास्तव में दुर्भाग्यवश के लिए डिज़ाइन नहीं किया गया था, लेकिन समय सीमा अगले हफ्ते है इसलिए हम वास्तव में अभी नहीं बदल सकते हैं! विचारों के लिए धन्यवाद, मैं यह देखने के लिए दूर रहूंगा कि चीज़ें कहां जाती हैं। – Farthingworth

+0

_Before_ आप प्लगिंग दूर रखते हैं, तो आप यह सुनिश्चित करना चाहते हैं कि प्रबंधन को इस संभावित देरी से अधिसूचित किया गया हो। उन्हें वास्तव में आश्चर्य पसंद नहीं है :-) – paxdiablo

+0

बूलियन के विपरीत बिट्स का उपयोग करने के आपके विचार पर त्वरित नोट, मैं केवल अपने परीक्षण के लिए बूलियन का उपयोग कर रहा था, हमारे वास्तविक कार्य में हम ऐसे structs का उपयोग कर रहे हैं जो डेटा का एक गुच्छा रखते हैं प्रक्रिया, इसलिए हम बूल के साथ क्या प्राप्त कर सकते हैं उससे काफी कम मिलता है। मैंने पहले से ही जितना संभव हो उतना कम कर दिया है = ( – Farthingworth

0

जैसा कि @paxdiablo ने सरणी के आकार का उल्लेख किया है, लगभग 32+ एक्सेल के लिए सैद्धांतिक अधिकतम 2 जीबी के साथ 400+ एमबी है। अधिकांश संभवतः वीबीए मैक्रोज़ स्मृति उपयोग में सीमित हैं। सरणी के लिए मेमोरी ब्लॉक भी स्मृति का एक संगत ब्लॉक होना चाहिए जो इसे आवंटन को और भी कठिन बनाता है। तो यह संभव है कि आप 40 एमबी आकार के दस सरणी आवंटित कर सकें, लेकिन 400 एमबी आकार में से एक नहीं। इसे जाँचे।

+0

आवंटित स्थान को बनाने के लिए मेमोरी ब्लॉक को आवंटित नहीं करना चाहिए? इसमें समय लगता है, लेकिन मुझे नहीं लगता कि यह स्मृति की त्रुटि को फेंक देगा – Juliusz

4

कुछ परीक्षण चलाने के बाद ऐसा लगता है कि 32-बिट वीबीए के लिए लगभग 500 एमबी और 64-बिट वीबीए (एक्सेल 2010-64) के लिए लगभग 4 जीबी की सीमा है।
मुझे नहीं पता कि क्या आप इन वीबीए सीमाओं को कम करते हैं यदि आप एक ही एक्सेल उदाहरण के भीतर बहुत सी कार्यपुस्तिका/पिवट स्मृति का उपयोग कर रहे हैं।

+0

ऐसा लगता है कि मैं जो भी प्राप्त कर रहा था, उसके बारे में प्रतीत होता है, धन्यवाद। कोशिश करें और देखें कि क्या हम 64-बिट संस्करण प्राप्त कर सकते हैं - 64-बिट मशीन का उपयोग करें जो खरीदा गया था लेकिन शायद ही कभी इस्तेमाल किया गया था! – Farthingworth

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