2010-01-08 9 views
7

चलो इसे तुरंत स्पष्ट करें: यह स्मृति रिसाव के बारे में कोई सवाल नहीं है! मेरे पास एक पृष्ठ है जो उपयोगकर्ता को इस डेटा को संभालने और परिणाम देने के लिए कुछ डेटा और जावास्क्रिप्ट दर्ज करने की अनुमति देता है। जावास्क्रिप्ट एक DIV पर वृद्धिशील आउटपुट, कुछ इस तरह का उत्पादन:जावास्क्रिप्ट उपलब्ध स्मृति खोजने के लिए

(function() 
{ 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    if (done) { 
     return; 
    } else { 
     setTimeout(arguments.callee, 0); 
    } 
})(); 

कुछ परिस्थितियों में गणना कि IE8 इस संदेश के साथ असफल हो जायेगी इतना डेटा का उत्पादन करेगा:

पर्याप्त नहीं भंडारण जब बहुत अधिक डेटा

सवाल यह है कि के साथ काम: वहाँ जिस तरह से मैं कितना डेटा काम कर सकते हैं बहुत अधिक डेटा है?

जैसा कि मैंने कहा था कि हल करने के लिए कोई बग नहीं है। यह स्मृति से वास्तविक है क्योंकि गणना को बहुत से HTML तत्व बनाने की आवश्यकता है।

मेरा विचार आगे बढ़ने के लिए गणना करने से पहले एक समारोह चलाने के लिए होगा यदि ब्राउज़र सफल होगा। लेकिन ऐसा करने के लिए, एक सामान्य तरीके से, मुझे लगता है कि मुझे अपने ब्राउज़र में उपलब्ध स्मृति को खोजने की ज़रूरत है।

कोई भी सुझाव स्वागत है।

+0

है, उपयोगकर्ता भी सामना नहीं कर सकते? – jldupont

+0

क्या यह कोड को घेरने/पकड़ने के साथ घूमने के लिए काम करता है? – erikkallen

+0

'memory.performance.usedJSHeapSize' क्रोम में अभी ठीक काम करता है। –

उत्तर

5

जावास्क्रिप्ट (ब्राउज़र में) एक sandbox, जिसका अर्थ है कि यह चीजों तक पहुँचने कि इस तरह के स्थानीय फ़ाइलों, सिस्टम संसाधन आदि के रूप में सुरक्षा के मुद्दों का कारण बन सकता से fenced बंद है में चलाया जाता है - तो नहीं, आप कर सकते हैं ' स्मृति उपयोग का पता लगाने टी।

अन्य उत्तरों के राज्य के रूप में, आप कार्यान्वयन के बीच या कम संसाधन-गहन कोड का उपयोग करके ब्राउज़र के लिए कार्य को आसान बना सकते हैं, लेकिन प्रत्येक ब्राउज़र की सीमाएं होती हैं।

+0

आपके उत्तर के लिए धन्यवाद। मुझे संदेह था कि मैं स्मृति उपयोग का पता नहीं लगा सका। – Zo72

0

मुझे संदेह है कि 0 टाइमआउट देरी समस्या है - यह तुरंत पुनः चलाने की कोशिश कर रहा है। इसे बढ़ाने का प्रयास करें।

+0

नहीं, यह नहीं है। 0 टाइमआउट देरी एक प्रसिद्ध तकनीक है। अगर आप मुझ पर विश्वास नहीं करते हैं तो चारों ओर गुगल करें। – Zo72

1

एक लूप रिकर्सन से कम स्मृति का उपयोग करेगा।

do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done); 

आप उत्पादित उत्तरों की संख्या पर कुछ ऊपरी सीमा भी लगा सकते हैं।

var answerCount = 0; 
    do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done && answerCount++ < 1000); 
+0

आपने इस सवाल को पूरी तरह गलत समझा है। कोई रिकर्सन नहीं है !!! ------------------------- – Zo72

+0

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

+0

देरी = 0 के साथ भी आपके पास रिकर्सन नहीं है। – Zo72

3

इतना डेटा के साथ इस के साथ एक खेल ...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>'); 
document.write(performance.memory.usedJSHeapSize+'<br><br>'); 
document.write(performance.memory.totalJSHeapSize); 
+0

प्रदर्शन ऑब्जेक्ट ... धन्यवाद जानना अच्छा है – Zo72

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