and*_*250 5 javascript memory memory-leaks file-upload filereader
我有一个具有文件上传功能的网页。上传以 5MB 块执行。我想在将每个块发送到服务器之前计算其哈希值。块由Blob对象表示。为了计算哈希值,我使用本机FileReader将此类 blob 读取到ArrayBuffer中。这是代码:
var reader = new FileReader();
var getHash = function (blob, callback) {
reader.onloadend = function (e) {
var hash = util.hash(e.target.result);
callback(hash);
};
reader.readAsArrayBuffer(blob);
}
var processChunk = function (chunk) {
if (chunk) {
getHash(chunk, function (hash) {
util.sendToServer(chunk, hash, function() {
// this callback is called when chunk upload is finished
processChunk(chunks.shift());
});
});
}
}
var chunks = file.splitIntoChunks(); // gets an array of blobs
processChunk(chunks.shift());
Run Code Online (Sandbox Code Playgroud)
问题:使用FileReader.readAsArrayBuffer似乎消耗了大量未释放的内存。到目前为止,我在以下浏览器上使用 5GB 文件进行了测试:
Chrome 55.0.2883.87 m(64 位):内存快速增加到 1-2GB,并在此范围内波动。有时它会一直上升并且浏览器选项卡崩溃。它可以使用比读取块的大小更多的内存。例如,读取 500MB 的块后,进程已经使用了 700MB 的内存。
Firefox 50.1.0:内存使用量在 300-600MB 左右波动
我尝试过的代码调整 - 均无济于事:
FileReader对所有块重新使用相同的实例(如本问题中所建议的)FileReader为每个块创建新的FileReader和设为nullArrayBuffer问题:有办法解决这个问题吗?这是 FileReader 实现中的错误还是我做错了什么?
编辑:这是一个 JSFiddle https://jsfiddle.net/andy250/pjt9udeu/
| 归档时间: |
|
| 查看次数: |
1556 次 |
| 最近记录: |