javascript - 是否可以在 FileReader 之后清理内存?

标签 javascript dom memory-leaks memory-management filereader

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

更新:

这是一个sample code (在大文件上测试它,比如电影,否则你不会在任务管理器中注意到效果):

<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>

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

我在 Firefox 和 Chrome 中都检查了这段代码,Chrome 似乎可以更优雅地处理它 - 它会在每个循环后清除内存并且速度非常快。但具有讽刺意味的是,Chrome 根本不需要使用这段代码。这只是一个克服 Gecko 6- FormData + Blob bug ( Bug 649150 - Blobs do not have a filename if sent via FormData ) 的实验。

最佳答案

试试这样:

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();
}

onloadend 将防止您与其他读取重叠...(显然,您可以更好地修复增量,但您明白了...)

关于javascript - 是否可以在 FileReader 之后清理内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7137760/

相关文章:

javascript - 是否可以修改 DOM 以进行 SQL 注入(inject)攻击或其他恶意攻击?

regex - Perl 程序在编译正则表达式时内存泄漏

javascript - 隐藏 CSS 网格中溢出的元素

java - 通过 java 写入 XML 文件不起作用

javascript - 从 html 按钮运行 javascript

javascript - DocumentFragments 的宽度和高度

java - 为什么在WeakReference中使用final

c++ - UIAutomation FindAll 泄漏内存

javascript - 在 knockout.js 中执行所有 observableArray 依赖项后如何执行函数

javascript - 使用 JavaScript 从表单中获取数据并将其放入表行中。