2011-09-09 17 views
28

आज मैं एक उत्सुक मुद्दे पर आया। यह दूसरों के लिए एक आसान जवाब हो सकता है, लेकिन यह मुझे stumped है। नीचे दिए गए कोड में स्मृति त्रुटि क्यों होती है?स्मृति से बाहर नोडजे

var cur = 167772160; 
var bcast = 184549375; 
var addresses = []; 
while (cur <= bcast){ 
    cur += 1; 
    addresses.push(cur); 
} 
addresses.length 
addresses // memory goes from a few megs to over a gig in seconds when trying to print this 

मैं इन दो त्रुटियों से एक है ... पहले जब मैं नोड के दुभाषिया और बाद में इस कोड को चलाने जब मैं nodeunit के माध्यम से इसे चलाने:

गंभीर त्रुटि: CALL_AND_RETRY_2 आबंटन में विफल रहा है - बाहर की प्रक्रिया स्मृति

गंभीर त्रुटि की: जे एस आबंटन विफल - प्रक्रिया स्मृति

+0

, मैं बफ़र्स का उपयोग कर करने लगे। सीमित सफलता। Http://stackoverflow.com/questions/7379755/buffer-size-in-nodejs –

उत्तर

7

ऐसा होता है जब मैं सरणी तक पहुंचने का प्रयास करता हूं। लेकिन लंबाई प्राप्त करना नहीं है।

> var cur = 167772160; 
> var bcast = 184549375; 
> var addresses = []; 
> while (cur <= bcast){ 
... cur += 1; 
... addresses.push(cur); 
... } 
16777216 
> addresses.length 
16777216 
> addresses 
FATAL ERROR: CALL_AND_RETRY_2 Allocation failed - process out of memory 

यहां एक और SO प्रश्न, memory limit in Node.js (and chrome V8) है जो स्मृति उपयोग के साथ समस्या से संबंधित है।

+1

ठीक है, तो मैं नहीं कर रहा हूँ केवल एक तो। हम्म क्या मुझे इसे nodejs github मुद्दों की सूची में टॉस करना चाहिए। –

+0

हाँ, मैंने देखा कि इतने पहले सवाल है, लेकिन मुझे नहीं लगता कि यह सिर्फ अब और नोड के है। मैं Google क्रोम को भी उस कोड को चलाने के साथ क्रैश कर सकता हूं। आह। –

+0

आह, Google क्रोम भी उसी v8 इंजन का उपयोग कर रहा है जो node.js. द्वारा उपयोग किया जाता है। मुझे 16,777,216 9 अंकों के पूर्णांक को संग्रहीत करने के रूप में एक बहुत ही कार्यान्वयन को देखने की कोशिश करें, वास्तव में बहुत सारी मेमोरी लेती है। – ace

4

से बाहर जब मैं अपनी स्क्रिप्ट चलाने मैं एक स्मृति आवंटन त्रुटि नहीं मिलता है। आपके सिस्टम पर कितनी रैम है?

लेखक के अपडेट किए गए नोट्स के साथ ठीक है, मैं इसे दोहराना कर सकता हूं।

नोड आपकी संपूर्ण सरणी को एक स्ट्रिंग में बदलने की कोशिश कर रहा है। सरणी 16777216 तत्व लंबी है। प्रत्येक तत्व में कम से कम 9 अंक लंबा होता है। एक स्ट्रिंग को 150,994,994 अक्षरों में परिवर्तित करना। यह सिर्फ एक बड़ा ऑपरेशन है जो नोड की स्मृति क्षमताओं से अधिक है।

+0

4 जीबी, मैकबुक एयर। पता। लम्बाई संपत्ति का उपयोग सुनिश्चित करें। यही वह जगह है जहां यह मेरी दुर्घटनाग्रस्त हो जाती है। मैं इसे जोड़ दूंगा। मैं उस भाग का उल्लेख करना भूल गया। lol –

+0

मेरे सेटअप के साथ भी ठीक काम करता है। क्या यह 'पता' लम्बाई होना चाहिए? – ace

+0

हाँ। टाइपो। मैंने अभी गतिविधि मॉनिटर देखा है। यदि आप केवल "पते" टाइप करते हैं और इसे सरणी को आज़माकर प्रिंट करने देते हैं, तो नोड का मेमोरी उपयोग सेकेंड के मामले में लगभग कुछ भी नहीं होता है, फिर मर जाता है। :(उदासी –

21

आप --max-old-space-size=<value> जो एमबी में है पारित करके डिफ़ॉल्ट सीमा बढ़ा सकते हैं।

उदाहरण (4096 मेगाबाइट) स्मृति के नोड के ढेर 4GB तक का उपयोग की अनुमति देगा:

node --max-old-space-size=4096 app 
रुचि रखने वालों के लिए
+4

4 जीबी वास्तव में 40 9 6 है, मैंने आपके जवाब को संपादित करने की कोशिश की लेकिन परिवर्तन 6 वर्णों से कम है। – Ido

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