将大文件作为切片读取时,HTML5 FileReader API会崩溃chrome 17

时间:2012-02-13 17:36:09

标签: html5 google-chrome filereader

我正在尝试将大文件(3GB)读取为100Mb的切片。

      ***function sliceMe() {
            var file = document.getElementById('files').files[0],
            fr = new FileReader;
            var chunkSize = document.getElementById('txtSize').value;
            chunkSize =1048576;            

            var chunks = Math.ceil(file.size / chunkSize);
            var chunk = 0;

            document.getElementById('byte_range').innerHTML = "";

            function loadNext() {
                var start, end,
                blobSlice = File.prototype.mozSlice || File.prototype.webkitSlice;
                start = chunk * chunkSize;
                if (start > file.size)
                    start = end+1;
                end = start + (chunkSize -1) >= file.size ? file.size : start + (chunkSize -1);
                fr.onload = function(e) {      
                    if (++chunk <= chunks) {
                        document.getElementById('byte_range').innerHTML += chunk + "  " +
                            ['Read bytes: ', start , ' - ', end,
                            ' of ', file.size, ' byte file'].join('')+"<br>";                        
                        //console.info(chunk);
                        loadNext(); // shortcut here

                    }
                };
                fr.readAsArrayBuffer(blobSlice.call(file, start, end));

            }
            loadNext();
        }***

以上代码在Firefox和Chrome 16中按预期工作。但在Chrome 17&amp; 18dev版本,在阅读1GB数据浏览器崩溃后。

Chrome 17中是否存在已知问题?

2 个答案:

答案 0 :(得分:2)

我在1.8 GB文件中读取时遇到同样的问题。如果我看任务管理器,chrome.exe将占用高达1.5 GB的内存,然后崩溃。我的解决方案是使用Javascript工作器,然后使用FileReaderSync而不是FileReader。 javascript worker在一个单独的线程中运行,而FileReaderSync只能在javascript worker中运行。

答案 1 :(得分:0)

您需要更改应根据文件大小更改块大小运行时间的算法。当循环连续运行时,谷歌浏览器会崩溃。