在FileReader之后可以清理内存吗?

jay*_*rjo 8 javascript dom memory-leaks memory-management filereader

FileReader似乎消耗了所有内存,因为它被重复用于预加载多个blob,并且永远不会释放它.任何已知的方法强制它释放消耗的内存?将FileReader对象及其result属性设置为null似乎不起作用.

更新:

这是一个示例代码(在大文件上测试它,比如电影,或者你不会注意到任务管理器中的效果):

<input id="file" type="file" onchange="sliceMe()" />

<script>
function sliceMe() {
    var file = document.getElementById('file').files[0], 
        fr,
        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 = new FileReader;
       fr.onload = function() {      
          if (++chunk < chunks) {
             // shortcut - in production upload happens and then loadNext() is called
             loadNext(); 
          }
       };
       fr.readAsBinaryString(blobSlice.call(file, start, end));
    }

    loadNext();
}
</script>
Run Code Online (Sandbox Code Playgroud)

我每次尝试创建新的FileReader实例,但问题仍然存在.我怀疑它可能是由模式的圆形性质引起的,但我不确定在这种情况下可以使用哪种其他模式.

我在Firefox和Chrome中检查了这个代码,Chrome似乎更优雅地处理它 - 它在每个周期后清除内存并且非常快.但具有讽刺意味的是,Chrome根本不需要使用此代码.这只是一个克服Gecko 6-FormData + Blob错误的实验(错误649150 - 如果通过FormData发送,Blob没有文件名).

jay*_*rjo 3

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();
}
Run Code Online (Sandbox Code Playgroud)

另一个错误报告已提交:https://bugzilla.mozilla.org/show_bug.cgi ?id=681479,这是相关的,但在本例中不是邪恶的。

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