2011-11-09 44 views
5

我已經創建了一個JSFiddle來查看可以將多少數據推送到我的瀏覽器中。瀏覽器中的JavaScript可以保存多少數據?

鏈路是http://jsfiddle.net/GWxAk/

的代碼很簡單。它只是試圖將盡可能多的字符串放入數組中。 這些字符串的長度大約爲300-310個字符。

我的問題是: 結果取決於我在PC上有多少內存? 它真的不同瀏覽器到瀏覽器?

例如,如果我有8GB的內存,我會得到更多,然後如果我有4GB?

var s = ''; 
for (var i = 0; i < 300; i++) { 
    s += 'a'; 
} 

array = []; 
count = 0; 

function doMore() { 
    for (var i = 0; i < 1000; i++) { 
     count++; 
     array.push(s + count); 
    } 
}; 

function repeat() { 
    doMore(); 
    document.body.innerHTML = 'size:' + array.length; 
    setTimeout(repeat, 100); 
} 

repeat(); 

在我的情況鉻掛在14850000和我有RAM 也就是近15萬件的陣列4GB。不錯我想

你們是否也有同樣的問題? 有人可以告訴你怎麼到瀏覽器給儘可能多的內存可能

感謝

+3

你有這樣的現實生活情況,還是你只是無聊的工作? – Matt

+0

我的機器上有16GB的內存,而且我在你所做的事情上稍微超過了一倍。你可以在這裏的屏幕截圖中看到我的結果http://screencast.com/t/3Xl31yGgHWC –

+0

看起來像瀏覽器的某種安全功能。即使在機器上沒有任何負擔,礦井也會停在相同的數量上。使用Chrome和16GB RAM。 – Toast

回答

7

同樣,我的機器有16GB的RAM。我可以看到瀏覽器的RAM使用率攀升,因此我認爲它也受RAM的限制。

IE crapped out at 16,840,000 
Chrome at 14,850,000 
Firefox 32,890,000 
Safari recycles itself around 8,720,000 (LOL @ Apple) 

這裏是內存使用的截圖和Firefox http://screencast.com/t/3Xl31yGgHWC

+0

非常感謝。你的答案非常有用。 – Zo72

2

我在Chrome和我想你的測試,它掛在你甚至提到的相同的1485萬,如果我只有RAM的2GB我正在運行一個虛擬機,在我的linux安裝中有windows,所以我給了700Mb的內存,所以我猜是肯定有限制

+0

直到[最近](http://code.google.com/p/v8/issues/detail?id = 847),V8(Chrome的JS引擎)的硬件上限爲1 GB。這是固定的,但32/64位版本的默認限制是700/1400 MB。 – josh3736

0

在32位機器上,你的上限總是4GB,如果是ands或buts。在實踐中,這將是非常不同的機器對機器(並非不尋常的有10 +標籤打開)

最好的方式去:只保留您的用戶正在積極工作的數據或任何你不能快速檢索服務器得心應手。其他一切,當用戶要求時得到。

+0

實際上,您只能使用大約2-3 GB的32位地址空間。這也適用於32位進程(這可能是爲什麼即使在16GB的計算機上它會很早停止)。注意:這個例子中的數組不僅需要大量的內存,還需要大量的連續內存! –

2

讓我們假設UTF8,這意味着你的 '一' 是2個字節/ 8位。

  • 14850000 * 300 = 44.55億個字符

  • 14850000 * 300 * 2 = 89.1億個字節

  • 1024分之8910000000= 8,701,171.875 KB
  • (1024分之8910000000)/ 1024 = 8,497.238159179688 MB
  • ((8910000000/1024)/ 1024)/ 1024 = 8.298084139823914 GB

因此,我們可以從您的測試中推測出,Chromes JS引擎中字符串的最大長度爲4,455,000,000字符,或者內存爲〜8.3GB。

但當然這不是發生了什麼事情。根據這些數字,你只有4GB的內存,但根本沒有出現〜4298MB,並且有陣列變量本身的結構,以及java VM和chrome本身的佔用等等等等。

更不用說,重新推s + count不是s,所以隨着計數數字的增加,被添加的字符串的長度也會增加。如果s是相同的,那麼它的值可能會被V8引擎節省。作爲參考,由於計數變量而增加的附加字符的數量,並且由於它的長度非線性增加,因此是9,7438,889個字符或185.85MB的數據。

所以這裏必須發生其他事情。

至於V8 JS引擎的限制:

http://code.google.com/p/v8/issues/detail?id=847

的32位內存地址空間的上限,併爲64位,該鏈接暗示〜1.9GB雖然它很可能是您的操作系統可以支持的物理上可用的上限。

因此,要總結:

  • 32位永遠是一個上限,而不是特定的JS變量,但JS VM,渲染,網頁內容的整捆的,等
  • 你的測試不太可靠,因爲它是計數的項目是不相同
  • 如果他們是相同的,你會落在琴絃

編輯的特殊情況處理犯規:

+0

我將計數添加到s以確保每個字符串都不相同。我的測試是可靠的,因爲每個項目必須是唯一的。 – Zo72

+0

不完全是,第一個項目比第11個要短1個字符,比第101個要短,比第1001個要短一個字符,因爲最後一個數字不是等於相等的單位大小(不管內容如何),因爲添加到數組中的最終字符串比初始字符串大得多。 –

+0

例如我的麪包車包含50個doghnuts,而您的麪包車包含20個dognuts,如果dognuts尺寸不相同,則無意義比較 –

相關問題