2013-05-30 39 views
2

使用谷歌Chrome瀏覽器的內存使用情況,假設我用ajax如下下載文件作爲BLOB:與XHR BLOB的responseType器(Chrome)

var xhr = new XMLHttpRequest(); 
xhr.open('GET', 'some/path', true); 
xhr.responseType = 'blob'; 

xhr.onload = function(e) {  
    //Save xhr.response using FileSystem API 
}; 

xhr.send(); 

我需要擔心內存使用在這裏(假設該文件下載可能會非常大,或者我可能以這種方式下載大量文件)?

我的理解是,因爲我指定的是'blob'而不是'arraybuffer'的responseType,所以下載的數據不會被加載到Javascript可用的內存中。但是,下載的數據必須存儲在某個地方。它只是存儲在內存中,還是瀏覽器會在必要時將其放入某種內存不足的高速緩存中?如果它在內存中被佔用,有什麼辦法讓我在完成它之後處理它(即在我的示例中,一旦我使用FileSystem API保存它)。

回答

0

我無法回答關於數據存儲位置的具體問題,但我會想象它會轉到磁盤上的內存。

我可以回答的部分是如何釋放blob對象本身使用的內存(不一定是數據,只是blob對象)。只要你沒有在當前範圍內使用該對象,或範圍已經結束,它將自動清理。例如,在閉包或匿名函數中,當函數結束時,在該範圍內創建的任何內容都將被垃圾收集。您也可以手動將其分配給空值或呼叫刪除。

您應該閱讀關於MDN的delete operator。 MDN上還有一個memory management page,可以更詳細地解釋上述過程。

1

我想它也會記憶。我記得一些關於鉻能夠處理800 MB RAM的地方,在某些地方,不確定。

但我做了1 GB的電影測試,看看網絡選項卡。最準確的是當我看到〜760MB基準測試時崩潰。因此,您最好的選擇是請求塊並將其附加到文件系統

0

數據始終存儲在內存中的nsCString中,該值通過加倍動態增長。所以一個260 MB的文件可以保留大約512 MB的內存。如果您想將響應數據複製到陣列緩衝區中,內存峯值會增加到772 MB,因爲還需要分配陣列緩衝區(260MB)。

只要XHR對象存在,臨時的512 MB nsCString就會成立。所以你必須設置xhr = null,以垃圾收集和釋放內存。當然,許多移動系統沒有太多的可用內存,並可能由於「內存不足」而崩潰。某些瀏覽器版本每個標籤都有內存限制,並且已經在768MB內存使用情況下崩潰。

那裏有一個新的Fetch-API,它允許基於塊的閱讀。流式傳輸響應主體可改善內存使用情況。在XHR中,整個響應將被緩衝,而不是能夠在塊中操作數據。