FileReader, кажется, потребляет всю память, поскольку он неоднократно используется для предварительной загрузки нескольких больших двоичных объектов и никогда не освобождает ее. Любой известный способ заставить его освободить потребляемую память? Установка объекта FileReader и его свойства результата в значение 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>
Я пытался каждый раз создавать новый экземпляр FileReader, но проблема все еще остается. Я подозреваю, что это может быть вызвано круговым характером узора, но я не уверен, какой другой узор можно использовать в этом случае.
Я проверил этот код как в Firefox, так и в Chrome, и Chrome, похоже, справляется с ним более изящно — он очищает память после каждого цикла и работает очень быстро. Но ирония ситуации в том, что Chrome вообще не нужно использовать этот код. Это просто эксперимент по преодолению ошибки Gecko 6- FormData + Blob (Ошибка 649150 - у BLOB-объектов нет имя файла, если оно отправлено через FormData).
null
, похоже, очищает память через несколько секунд (при выборе другой вкладки). - person pimvdb   schedule 21.08.2011