Javascript 是否可以在文件读取器之后清理内存?
FileReader似乎消耗了所有内存,因为它被反复用于预加载多个blob,并且从未释放它。有没有已知的方法可以迫使它释放消耗的内存?将FileReader对象及其结果属性设置为null似乎不起作用 更新: 下面是一个示例(在大文件(如电影)上进行测试,否则您不会注意到任务管理器中的效果):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
函数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();
}