2010-01-08 26 views
7

讓我們馬上清楚:這不是關於內存泄漏的問題! 我有一個頁面,允許用戶輸入一些數據和JavaScript來處理這些數據併產生結果。 中的JavaScript產生一個DIV增量輸出,這樣的事情:javascript查找內存

(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

它是否可以用try/catch包圍代碼? – erikkallen

+0

'memory.performance.usedJSHeapSize'現在在Chrome中運行得很好。 –

回答

5

的Javascript(瀏覽器)是在沙箱中,這意味着它是訪問的東西,可能會導致安全問題,如本地文件,系統資源等操刀的運行 - 所以沒有,你可以」檢測內存使用情況。

由於其他答案的狀態,您可以通過在實現之間暫停或使用資源密集程度較低的代碼使瀏覽器更容易,但每個瀏覽器都有其限制。

+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

傳遞參數。被調用者setTimeout再次調用函數,但你是正確的,它不是嚴格遞歸,因爲setTimeout允許調用函數返回(至少它應該,但也許延遲= 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