如何在JS中高效处理大量数据内存

时间:2014-03-18 15:00:12

标签: javascript memory

在尝试使用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倍。

0 个答案:

没有答案