2016-02-25 4 views
6

मैं एक कार्यक्रम है जहाँ मैं एक बहुत बड़ी short[] सरणी का उपयोग किया जाएगा है की तुलना में बड़ा ढेर स्थान की आवश्यकता होती और इसलिए 2^30 तत्वों के साथ एक सरणी को लगभग 2 जीबी रैम की आवश्यकता होनी चाहिए।जावा क्या उचित

क्रम कार्यक्रम चलाने के लिए, इसलिए मैं

java -Xms2000m HPTest 

की कोशिश की, लेकिन अभी भी एक ढेर अंतरिक्ष त्रुटि मिली। यहां तक ​​कि 3000m पर भी मुझे एक ही त्रुटि मिली, लेकिन 4000m पर यह काम किया।

कोई विचार है कि मुझे 2000m की अनुमानित सीमा से अब तक क्यों जाना है?

संपादित करें: जैसा कि कई उपयोगकर्ताओं द्वारा इंगित किया गया है, मैंने यह घोषणा करने में एक बहुत ही शर्मनाक त्रुटि की है कि 2 बाइट्स की बजाय एक छोटी आवश्यकता है। सवाल तब होना चाहिए कि यह 2000m के साथ पर्याप्त क्यों नहीं है।

+7

छोटा 2 बाइट्स है ... –

+1

एक 'बाइट' एक बाइट है, इस प्रकार नाम। बीटीडब्ल्यू '1 << एन' की शक्ति के लिए 2 की गणना करने का एक और अधिक प्रभावी तरीका है। –

+0

फिर भी, 3000 मीटर/3 जीबी उसके लिए पर्याप्त होना चाहिए? –

उत्तर

5

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

java.nio.ShortBuffer देखें और वहां से खुदाई शुरू करें।

+0

धन्यवाद! दूसरे विचार पर, मैं एक बाइट सरणी में नीचे स्विच करने में सक्षम हो सकता है।वैसे भी, मैं मूल रूप से सरणी का उपयोग 0 से 2^30-1 के सभी पूर्णांक के विभिन्न कंटेनर से संबंधित झंडे की सरणी के रूप में करूँगा। इसलिए, जैसा कि मैं इन पूर्णांकों के माध्यम से लूप करता हूं, मैं ध्वज को अपने लघु/बाइट सरणी के इसी सूचकांक पर एक निश्चित मान पर सेट कर दूंगा। जहां तक ​​मैं देख सकता हूं, मैं हर बार बफर पर डाल() को कॉल करके इसे पूरा कर सकता हूं। क्या यह बहुत धीमा होगा? –

+0

असल में, आवंटन जो बड़े हैं, सीधे "ओल्ड जनरल" पूल में जाते हैं, और कचरा कलेक्टर द्वारा प्रतिलिपि नहीं बनाई जाएगी। मैंने अनुभव किया कि यह सच होने के लिए परीक्षण किया गया है, और मुझे लगता है कि कहीं कहीं पढ़ना याद है, लेकिन मेरे पास इस समय कोई संदर्भ नहीं है। – Andreas

+0

@AlexandreVandermonde यदि वे सिर्फ झंडे हैं, तो आपको इसे 'बूलियन' सरणी बनाना चाहिए, और JVM 8 बूलियन को एक बाइट में निचोड़ सकता है। – Andreas

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