問題描述
我有一些看起來像這樣的 javascript 代碼:
var myClass = {編號:{}myFunc:函數(巨大字符串){var id = huge_string.substr(0,2);ids[id] = 真;}}
稍后,該函數被一些大字符串 (100 MB+) 調用.我只想保存在每個字符串中找到的短 id.但是,谷歌瀏覽器的子字符串函數(實際上是我的代碼中的正則表達式)只返回一個切片字符串"對象,它引用了原始對象.因此,在對 myFunc
的一系列調用之后,我的 chrome 選項卡內存不足,因為臨時 huge_string
對象無法被垃圾回收.
如何復制字符串 id
以便不維護對 huge_string
的引用,并且 huge_string
可以垃圾收集了嗎?
JavaScript 的 ECMAScript 實現因瀏覽器而異,但對于 Chrome,許多字符串操作(substr、slice、regex 等)只是保留對原始字符串,而不是復制字符串.這是 Chrome 中的一個已知問題(
I have some javascript code which looks like this:
var myClass = {
ids: {}
myFunc: function(huge_string) {
var id = huge_string.substr(0,2);
ids[id] = true;
}
}
Later the function gets called with some large strings (100 MB+). I only want to save a short id which I find in each string. However, the Google Chrome's substring function (actually regex in my code) only returns a "sliced string" object, which references the original. So after a series of calls to myFunc
, my chrome tab runs out of memory because the temporary huge_string
objects are not able to be garbage collected.
How can I make a copy of the string id
so that a reference to the huge_string
is not maintained, and the huge_string
can be garbage collected?
JavaScript's implementation of ECMAScript can vary from browser to browser, however for Chrome, many string operations (substr, slice, regex, etc.) simply retain references to the original string rather than making copies of the string. This is a known issue in Chrome (Bug #2869). To force a copy of the string, the following code works:
var string_copy = (' ' + original_string).slice(1);
This code works by appending a space to the front of the string. This concatenation results in a string copy in Chrome's implementation. Then the substring after the space can be referenced.
This problem with the solution has been recreated here: http://jsfiddle.net/ouvv4kbs/1/
WARNING: takes a long time to load, open Chrome debug console to see a progress printout.
// We would expect this program to use ~1 MB of memory, however taking
// a Heap Snapshot will show that this program uses ~100 MB of memory.
// If the processed data size is increased to ~1 GB, the Chrome tab
// will crash due to running out of memory.
function randomString(length) {
var alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
var result = '';
for (var i = 0; i < length; i++) {
result +=
alphabet[Math.round(Math.random() * (alphabet.length - 1))];
}
return result;
};
var substrings = [];
var extractSubstring = function(huge_string) {
var substring = huge_string.substr(0, 100 * 1000 /* 100 KB */);
// Uncommenting this line will force a copy of the string and allow
// the unused memory to be garbage collected
// substring = (' ' + substring).slice(1);
substrings.push(substring);
};
// Process 100 MB of data, but only keep 1 MB.
for (var i = 0; i < 10; i++) {
console.log(10 * (i + 1) + 'MB processed');
var huge_string = randomString(10 * 1000 * 1000 /* 10 MB */);
extractSubstring(huge_string);
}
// Do something which will keep a reference to substrings around and
// prevent it from being garbage collected.
setInterval(function() {
var i = Math.round(Math.random() * (substrings.length - 1));
document.body.innerHTML = substrings[i].substr(0, 10);
}, 2000);
這篇關于如何強制 JavaScript 深度復制字符串?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!