Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 是否可以在文件读取器之后清理内存?_Javascript_Dom_Memory Leaks_Memory Management_Filereader - Fatal编程技术网

Javascript 是否可以在文件读取器之后清理内存?

Javascript 是否可以在文件读取器之后清理内存?,javascript,dom,memory-leaks,memory-management,filereader,Javascript,Dom,Memory Leaks,Memory Management,Filereader,FileReader似乎消耗了所有内存,因为它被反复用于预加载多个blob,并且从未释放它。有没有已知的方法可以迫使它释放消耗的内存?将FileReader对象及其结果属性设置为null似乎不起作用 更新: 下面是一个示例(在大文件(如电影)上进行测试,否则您不会注意到任务管理器中的效果): 函数sliceMe(){ var file=document.getElementById('file')。文件[0], fr, chunkSize=2097152, chunks=Math.ceil(f

FileReader似乎消耗了所有内存,因为它被反复用于预加载多个blob,并且从未释放它。有没有已知的方法可以迫使它释放消耗的内存?将FileReader对象及其结果属性设置为null似乎不起作用

更新:

下面是一个示例(在大文件(如电影)上进行测试,否则您不会注意到任务管理器中的效果):


函数sliceMe(){
var file=document.getElementById('file')。文件[0],
fr,
chunkSize=2097152,
chunks=Math.ceil(file.size/chunkSize),
组块=0;
函数loadNext(){
开始,结束,
blobSlice=File.prototype.mozSlice | | File.prototype.webkitSlice;
开始=区块*区块大小;
end=start+chunkSize>=file.size?file.size:start+chunkSize;
fr=新文件读取器;
fr.onload=函数(){
如果(++块<块){
//快捷方式-在产品中进行上载,然后调用loadNext()
loadNext();
}
};
fr.readAsBinaryString(blobSlice.call(file,start,end));
}
loadNext();
}
我每次都尝试创建新的FileReader实例,但问题仍然存在。我怀疑这可能是由模式的循环性质造成的,但我不确定在这种情况下还可以使用什么其他模式


我在Firefox和Chrome中都检查了这段代码,Chrome似乎能更优雅地处理它——它在每个周期后都会清除内存,而且速度非常快。但讽刺的是,Chrome根本不需要使用这个代码。这只是一个克服Gecko 6-FormData+Blob bug()的实验。

bug被标记为无效,因为事实证明我没有正确地重新使用FileReader对象

以下是一种不会占用内存和cpu的模式:

function sliceMe() {
    var file = document.getElementById('file').files[0],
        fr = new FileReader,
        chunkSize = 2097152,
        chunks = Math.ceil(file.size / chunkSize),
        chunk = 0;

    function loadNext() {
       var start, end,
           blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice;

       start = chunk * chunkSize;
       end = start + chunkSize >= file.size ? file.size : start + chunkSize;

       fr.onload = function() {      
          if (++chunk < chunks) {
             //console.info(chunk);
             loadNext(); // shortcut here
          }
       };
       fr.readAsBinaryString(blobSlice.call(file, start, end));
    }

    loadNext();
}
函数sliceMe(){
var file=document.getElementById('file')。文件[0],
fr=新文件读取器,
chunkSize=2097152,
chunks=Math.ceil(file.size/chunkSize),
组块=0;
函数loadNext(){
开始,结束,
blobSlice=File.prototype.mozSlice | | File.prototype.webkitSlice;
开始=区块*区块大小;
end=start+chunkSize>=file.size?file.size:start+chunkSize;
fr.onload=函数(){
如果(++块<块){
//控制台信息(块);
loadNext();//此处为快捷方式
}
};
fr.readAsBinaryString(blobSlice.call(file,start,end));
}
loadNext();
}
另一个bug报告已经提交:,这是相关的,但不是本例中的邪恶


感谢凯尔·休伊让我注意到了这一点:)

试试这样吧:

function sliceMe() {
        var file = document.getElementById('file').files[0],
        fr = new FileReader,
        chunkSize = 2097152,
        chunks = Math.ceil(file.size / chunkSize),
        chunk = 0;

    function loadNext() {
       var start, end,
           blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice;

       start = chunk * chunkSize;
       end = start + chunkSize >= file.size ? file.size : start + chunkSize;

       fr.onload = function() {      
          if (++chunk < chunks) {
             //console.info(chunk);
          }
       };
       fr.onloadend = function(e) {      
          loadNext(); // shortcut here
       };
       fr.readAsBinaryString(blobSlice.call(file, start, end));
    }

    loadNext();
}
函数sliceMe(){
var file=document.getElementById('file')。文件[0],
fr=新文件读取器,
chunkSize=2097152,
chunks=Math.ceil(file.size/chunkSize),
组块=0;
函数loadNext(){
开始,结束,
blobSlice=File.prototype.mozSlice | | File.prototype.webkitSlice;
开始=区块*区块大小;
end=start+chunkSize>=file.size?file.size:start+chunkSize;
fr.onload=函数(){
如果(++块<块){
//控制台信息(块);
}
};
fr.onloadend=函数(e){
loadNext();//此处为快捷方式
};
fr.readAsBinaryString(blobSlice.call(file,start,end));
}
loadNext();
}

onloadend将防止您与其他读取重叠。。。(显然,您可以更好地修复增量,但您已经有了想法……

您是否尝试不重用文件读取器,而是在每次需要时创建一个新实例?您是否有明确的示例?什么浏览器?你能做一把小提琴吗?谢谢你的例子。将其设置为
null
似乎会在几秒钟后清除内存(当选择另一个选项卡时)。有趣的观察。。。嗯。实际上,有时它甚至在不将其设置为null的情况下也会清除内存,但如果设置为null,则情况更为明显。我现在想知道我们是否能以某种方式使用它…提交了一个bug:,欢迎你们投票。嘿,这个解决方案真的对你们有用吗??我有一个类似的问题,类似的尝试是在片中加载大文件。但当加载大于gig的文件时,chrome仍会崩溃或失去响应。我正在重复使用FileReader对象,而不是每次构造一个。是否将整个文件加载到内存中?否,我正在尝试分片读取文件。事实上,我甚至试着复制上面列出的代码。我很确定你想要的是后增量而不是前增量。这是(chunk++function sliceMe() { var file = document.getElementById('file').files[0], fr = new FileReader, chunkSize = 2097152, chunks = Math.ceil(file.size / chunkSize), chunk = 0; function loadNext() { var start, end, blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice; start = chunk * chunkSize; end = start + chunkSize >= file.size ? file.size : start + chunkSize; fr.onload = function() { if (++chunk < chunks) { //console.info(chunk); } }; fr.onloadend = function(e) { loadNext(); // shortcut here }; fr.readAsBinaryString(blobSlice.call(file, start, end)); } loadNext(); }