在尝试使用JavaScript处理离线StarDict词典时,我遇到了奇怪的JavaScript内存消耗行为(在Gecko中测试,即Firefox 27)。
实际上,我有一个大约6.2 MB的StarDict文件* .syn,包含313,608个未压缩的UTF-8编码字符串以及一些额外的数据。然后我使用下面的代码将它作为313,608个字符串的数组加载到我的JavaScript中。
我最终得到了appx。 48 MB的内存消耗。 (检查一下:内存;记住我们从6.2 MB开始!)当切换标签并等待几分钟时,此值下降到37 MB。 JavaScript在内部使用UTF-16,因此我预期的最糟糕的是appx。 15 MB。但它的两倍多!我不知道,可能是什么导致了这一点,我不知道该怎么做才能更有效地处理JavaScript中的这些数据量。请给出建议!
代码或如何重现
将它放在HTML的正文中:
<input type="file" />
然后使用此JavaScript onload代码:
function getUintAt(arr, offs) {
out = 0;
for (var j = offs; j < offs+4; j++) {
out <<= 8;
out |= arr[j] & 0xff;
}
return out;
}
var arr = [],
upload = document.getElementsByTagName('input')[0];
upload.onchange = function (evt) {
evt.preventDefault();
var file = evt.target.files[0],
reader = new FileReader();
reader.readAsArrayBuffer(file);
reader.onload = function (evt) {
var buffer = evt.target.result,
view = new Uint8Array(buffer),
decoder = new TextDecoder("utf-8");
for(var i = 0, j = 0; i < view.length; i++) {
if(view[i] == 0) {
var term = decoder.decode(view.subarray(j,i)),
extra = getUintAt(view, i+1);
arr.push({ term: term, extra: extra });
i += 5; j = i;
}
}
console.log(arr.length);
};
};
并从http://tovotu.de/data/pape_gr-de.zip中选择* .syn文件作为文件输入元素。您可以使用类似的StarDict词典(即具有大型syn文件!)进行测试,并得到类似的结果:处理大小为X的同义词文件? JavaScript需要大约7到8倍。